У мікросервісі - це одна база даних чи окремий екземпляр бази даних для кожної служби?


50

Я розумію, що кожна служба в архітектурі мікросервісу повинна мати власну базу даних. Однак, маючи власну базу даних, чи насправді це означає просто мати іншу базу даних у межах одного екземпляра бази даних або буквально мати інший екземпляр бази даних?

Під цим я маю на увазі не обмін базами даних, що є ні-ні, а скоріше екземпляр бази даних.

Наприклад, якщо я використовував AWS і маю 3 служби, чи створюю 3 бази даних для кожної служби в одному екземплярі RDS або створюю 3 екземпляри RDS, кожен з яких містить базу даних, яка використовується незалежно кожною з 3 служб?

Якщо використання декількох баз даних в одному екземплярі RDS є кращою ідеєю, чи не буде це завдання незалежних служб, оскільки для:

  1. Ресурс екземпляра RDS буде поділятися між службами. Чи вплине Сервіс A, який може мати велике використання баз даних у певний час, що впливає на службу B, яка використовує іншу базу даних, але в тому ж екземплярі RDS?

  2. Усі сервіси залежатимуть від версії бази даних у цьому екземплярі RDS.


8
Це все, що найкраще відповідає вашим конкретним вимогам.
Роберт Харві

1
Я не впевнений, що я б назвав себе фахівцем з "мікропослуг", але у вас можуть бути будь-які налаштування та dbs. Ви можете мати db, який читає одна служба і записується іншою. Або ж ви можете мати лише 1 дБ (або менш технічно) для всієї системи.
Марк Роджерс

Ось добре прочитайте питання: plainoldobcts.com/2015/09/02/…
RandomUs1r

Читайте про "Принцип єдиної відповідальності". Чи задумувались ви над тим, щоб застосувати "мікросервіс бази даних", який використовують інші мікросервіси?
ChuckCottrill

Відповіді:


20

Це дійсно залежить від ваших вимог до масштабованості та того, як / якщо вашим екземплярам мікросервісу необхідно співпрацювати для досягнення єдиного результату. Це допомагає дізнатися, що таке компроміси:

Зберігаючи все це в одній базі даних

  • Простіша конфігурація
  • Не потрібна координація чи спілкування з іншими прикладами вашої служби
  • Простіше відкрити повний набір даних
  • Продуктивність системи обмежена продуктивністю бази даних

Зберігання баз даних окремо

  • Повна відповідь на запит може бути розповсюджена у всіх примірниках мікросервісу
  • У такому випадку ви розширили спілкування та переговори щодо вирішення запиту
  • Обробка даних, коли ви втратите цей вузол мікросервісу (навіть коли база даних все ще працює, ви не можете отримати на ній, поки не встане резервна копія нового з правильною конфігурацією)
  • Підвищена складність конфігурації

Яку проблему ви вирішуєте?

У деяких випадках вас хвилюють лише ефемерні дані. Якщо база даних знизиться, це не велика проблема. У цих випадках для початку вам навіть не знадобиться база даних. Просто збережіть це в пам’яті і зробіть все надзвичайно швидко. Це найпростіше рішення для роботи.

В інших випадках вам потрібна цілісність даних, але ваша база даних здатна розширити свою ємність, виходячи з кількості вузлів, які вона має. У цьому випадку однієї бази даних, мабуть, більш ніж достатньо, а управління її чуйністю самостійно є правильною відповіддю.

Між ними існує ряд випадків. Наприклад, у вас можуть бути бази даних, що мають регіональний характер, тому для кожного примірника вашої послуги в іншому регіоні ви маєте окрему базу даних. Зазвичай розширення баз даних не дуже добре в різних регіонах, тому це спосіб трохи локалізувати дані та контролювати координацію.

Вчення і реальність

Я прочитав низку статей про мікросервіси та про те, наскільки вони мають бути модульними. Рекомендації варіюються від збереження переднього, мікросервісного та рівня даних в цілому, до спільного використання бази даних та / або коду фронтальних даних для всіх примірників. Зазвичай більше ізоляції забезпечує найбільшу масштабованість, але це відбувається ціною підвищеної складності.

Якщо ваш мікросервіс обчислюється важким, має сенс дозволити кількість необхідних масштабів мікросервісів - обмін базами даних або навіть кодом переднього кінця не заважають і не перешкоджають такому підходу.

Реальність полягає в тому, що конкретні потреби вашого проекту потребують різного набору компромісів, щоб вчасно виконати роботу та впоратися з вимірюванням навантаження, яке ви вимірюєте (плюс ще трохи). Розгляньте повністю ізольовану передню частину, мікросервіс та трирічне рівня даних як найвищу мету. Чим більше попит у вашій системі, тим ближче до цієї мети вам, ймовірно, потрібно буде. Ми не всі [insert name of highly successful web entity here], і вони не починалися там, де зараз є. Іноді просто потрібно почати з менш ніж досконалої ситуації і бути задоволеною цим.


71

Припустимо, що у вас є деякі сервіси, які можуть використовувати один і той же тип системи та версії БД, якщо ви використовуєте різні екземпляри бази даних або db, це рішення, яке вам не потрібно приймати під час проектування. Натомість ви повинні мати можливість приймати рішення під час розгортання, що можна просто налаштувати. Створіть свої послуги так, щоб вони відповідали місцям розміщення баз даних інших служб.

Під час роботи можна почати з одного примірника, і якщо система працює нормально, залиште це так. Однак, якщо ви помітили, що це не добре підходить для вашої системи, оскільки різні бази даних в одному екземплярі мають занадто багато ресурсів, у вас завжди є можливість використовувати різні екземпляри, якщо це допомагає.

Отже, сервіс не порушує архітектуру мікросервісу лише тому, що ви дозволяєте двом із них ділитися деяким ресурсом - він порушує його, коли обмін ресурсом стає обов'язковим.


Цей вид звучить як передчасна оптимізація. Що робити, якщо споживані ресурси ніколи не заслуговують на зайві екземпляри? Тоді ви витратили час на створення гнучкості
reggaeguitar

5
@reggaeguitar: витрати на це зазвичай мають бути незначними - насправді для архітектури мікросервісу може бути докладено більше зусиль, щоб спробувати централізувати конфігурацію бази даних між різними службами, ніж зберігати розташування db для кожної служби індивідуально налаштовуватися. Більше того, вся суть архітектури мікросервісу - це висока масштабованість, якщо цього не потрібно, не слід приймати рішення щодо мікропослуг в першу чергу.
Док Браун

1
@DocBrown Це має сенс, дякую за відповідь!
reggaeguitar

13

Це не має значення.

Єдиний сценарій, де теоретично це може мати значення, - це якщо одна служба потребує переходу на інші версії бази даних. Але навіть тоді немає жодної реальної різниці між тим, щоб мати окремі екземпляри від початку, а не переміщувати одну службу із спільного екземпляра в окремий. Я б фактично сказав, що наявність окремих примірників лише через цей сценарій є прикладом YAGNI.


1
Якщо припустити, що певна служба має велике використання в одному екземплярі RDS, чи закінчиться вона з'їдання ресурсів у цьому екземплярі і вплине на інші служби, що використовують той самий екземпляр RDS?
ксенон

1
@xenon: так, але це є підставою думати про покращення продуктивності RDS за допомогою налаштування, кращого обладнання або кластеризації, а не про зміну архітектури системи - якщо ця послуга залишає потенціал для інших служб, то незабаром у неї вичерпається потужність все само собою. Хоча я думаю, ви можете мати особливі вимоги, що перевантажений сервіс не повинен впливати на інших. Деякі RDS можуть насправді дозволити це в одному екземплярі, визначаючи обмеження ресурсів на користувацькій основі.
Майкл Боргвардт

Сценарій, коли це має значення, це коли екземпляр мікросервісу має власний стан. Тоді його слід розгорнути з власним екземпляром db, який також може бути вузьким місцем продуктивності
Еван

3

Екземпляр RDS - це одне поле. Якщо у вас є декілька баз даних в одному екземплярі, вони діляться процесором / пам'яттю тощо.

Якщо продуктивність вашої мікросервісу пов'язана з її продуктивністю : потім розгортання декількох копій мікросервісу, кожна з яких використовує іншу базу даних, але з кожною базою даних в одному екземплярі RDS. Безглуздо * (крім відмови). Ваш кластер мікросервісів буде працювати з тією ж швидкістю, що і одна мікросервіс

Однак я б сказав, що мікросервіс, пов'язаний з роботою бази даних, є незвичним.

Зазвичай ваша мікросервіс отримуватиме дані від db, виконує певну логіку і записує інформацію в базу даних. Вузьке місце продуктивності - це логіка , а не вибір та / або вставка.

У цьому випадку ви можете просто поділитися однією і тією ж базою даних у всіх ваших екземплярах мікросервісу


Я маю сумніватися у вашому твердженні, що логіка - це вузьке місце, а не база даних. На мій досвід, найімовірніше місце для покращення продуктивності - це база даних.
RubberDuck

хм так, але, безумовно, ці покращення продуктивності досягаються переміщенням логіки з db та в службу. Після того, як ви зробили це, ТОДІ логіка є вузьким місцем
Ewan

1
Як правило, ні. Ці покращення походять від настройки індексів та запитів.
RubberDuck

добре, це підпадало б під незвичний випадок мого досвіду. Справа не в тому, що для цих вдосконалень зазвичай не залишається місця, але те, що після вилучення будь-яких дійсно поганих речей, база даних все ще є обмежуючим фактором.
Еван

1

Метою збереження приватної бази даних для сервісу є інкапсуляція. Ваша мікросервіс - це чорна скринька, яку інші сервіси системи використовуватимуть через загальнодоступний інтерфейс.

Є дві площини, на яких діє ця інкапсуляція:

  • Перший логічний, на рівні програми. Ваша служба володіє деякими бізнес-об’єктами у вашій системі, і їй потрібно зберігати інформацію про ці об'єкти. Що якась конкретна база даних підтримує ці бізнес-об’єкти - це лише детальна інформація про впровадження. Зберігаючи окрему базу даних, ви не дозволяєте іншим службам мати задній доступ до вашої реалізації, змушуючи їх замість цього використовувати ваш публічний інтерфейс. Мета тут - чиста архітектура та дисципліноване програмування. Там, де саме живе база даних, на цьому рівні не має значення, якщо ваша служба має правильні дані про з'єднання, щоб вона змогла її знайти.

  • Другий рівень діє. Навіть якщо ваш дизайн є ідеальною чорною скринькою, як зазначаєте, різні роботи, розміщені на одній машині, можуть конкурувати за ресурси. Це вагомий привід розміщувати окремі логічні бази даних на окремих машинах. Як зазначалося в інших відповідях, якщо ваші потреби не дуже вимогливі, а ваш бюджет обмежений, це прагматичний аргумент для колонізації на одній машині. Однак, як завжди, компроміси: ця установка може зажадати більше няні, коли ваша система зростає. Якщо бюджет дозволяє, я майже завжди віддаю перевагу двом окремим маленьким машинам для виконання двох завдань, ніж спільному використанню однієї більшої машини.


1

Я думаю, що це може допомогти бути трохи більш теоретичним. Однією з мотивуючих ідей мікросервісів є спільне - нічого, процеси передачі повідомлень. Мікросервіс - це як актор у моделі "Актор". Це означає, що кожен процес підтримує свій власний локальний стан, і єдиний спосіб доступу одного стану в інший - це надсилання повідомлень (і навіть тоді інший процес може реагувати, наскільки це подобається на ці повідомлення). Мається на увазі те, що "кожна мікросервіс має свою базу даних" - це те, що стан процесу (тобто мікросервіс) є локальним та приватним . Значною мірою, це говорить про те, що «база даних» повинні бути співвіднесеніз мікросервісом, тобто "база даних" повинна зберігатися і виконуватися на тому ж логічному вузлі, що і мікросервіс. Різні "екземпляри" мікросервісу - це окремі процеси, і тому кожен повинен мати свою "базу даних".

Глобальна база даних або база даних, що ділиться між мікропослугами або навіть екземплярами мікросервісу, з цього погляду становитиме спільний стан. "Відповідний" спосіб вирішити це з точки зору мікросервісів - це посередницька база даних опосередкована мікросервісом "база даних". Інші мікросервіси, які хотіли дізнатися про вміст бази даних, надсилали б повідомлення в цю "мікросервіс бази даних". Зазвичай це не виключає потреби в локальному стані (тобто "базі даних" для екземпляра мікросервісу) для оригінальних мікросервісів! Зміни - те, що представляє місцева держава. Замість того, щоб зберігати "Користувач Саллі - адміністратор", він зберігатиме "Мікросервіс бази даних сказав:" Користувач Саллі - адміністратор "п'ять хвилин тому". Іншими словами, про стан інших мікросервісів.

Користь у тому, що кожна мікросервіс є самодостатнім. Це робить мікросервіс атомною одиницею відмови. Вам (здебільшого) не потрібно турбуватися про мікросервіс у якомусь частково функціональному стані. Звичайно, проблема була перенесена на мережу мікросервісів. Мікросервіс, можливо, не зможе виконати потрібну функцію через неможливість зв’язатися з іншими мікросервісами. Користь, однак, полягає в тому, що мікросервіс буде у чітко визначеному стані і цілком може запропонувати деградований або обмежений сервіс, наприклад, відпрацювавши застарілі переконання. Мінус полягає в тому, що дуже складно отримати послідовний знімок системи в цілому, і може бути досить багато (небажаних) надмірностей і дублювання.

Звичайно, пропозиція не вклеювати екземпляр Oracle у кожен контейнер Docker. По-перше, не кожному мікросервісу потрібна "база даних". Для коректної роботи деяких процесів не потрібно стійкого стану. Наприклад, мікросервіс, який перекладається між двома протоколами, не обов'язково потребує стійкого стану. Бо коли потрібен стійкий стан, слово "база даних" - це лише слово для "стійкого стану". Це може бути файл із JSON в ньому або база даних Sqlite або локально запущена копія Oracle, якщо ви хочете, або будь-який інший спосіб локальноїнаполегливо зберігати дані. Якщо "база даних" не локальна, то з точки зору чистої мікросервісу до неї слід ставитися як до окремої (мікро) служби. З цією метою ніколи не має сенсу, щоб екземпляр RDS був "базою даних" для мікросервісу. Знову ж таки, перспектива - це не "купа мікросервісів із власними базами даних RDS", а "купа мікросервісів, які спілкуються з базами даних RDS". На даний момент немає жодної різниці, зберігаються вони в одному екземплярі бази даних чи ні.

Практично архітектура мікросервісів додає величезну кількість складності. Ця складність є лише ціною серйозної боротьби з частковим збоєм. Для багатьох це надмірність, яка, можливо, не варта переваг. Ви повинні сміливо архітектуру своєї системи будь-яким способом, який видається найбільш вигідним. Є хороший шанс, що занепокоєння щодо простоти та ефективності може призвести до відхилень від чистої архітектури мікросервісів. Вартість буде додатковою зв'язкою, яка представляє власні складності, такі як невидима взаємодія між службами та обмеження вашої свободи розгортання та масштабування за вашим бажанням.


"через неможливість зв’язатися з іншими мікросервісами." - Я думав, що мікросервіси ніколи не повинні контактувати з іншими мікросервісами?
Марк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.