Багато-багато асоціацій у мікросервісах


13

Наразі у мене є дві мікросервіси. Ми їх подзвонимо Aі B.

База даних в мікросервісі Aмає таку таблицю:

A
|-- users

База даних в мікросервісі Bмає таку таблицю:

B
|-- trackers

Вимоги держава, usersі trackersє багато-до-багатьох.

Я не впевнений, як правильно впоратися з цим в архітектурі мікросервісів.

Я міг бачити це, працюючи одним із трьох способів:

  1. user_trackersТаблиця додається до microservice A. Це діє аналогічно таблиці приєднання, що містить "сторонні ключі" до usersта trackers.
  2. ownersТаблиця додається до microservice B. Ця таблиця діє подібно до поліморфної таблиці приєднання. Це дозволить будь-якій службі створити асоціацію з трекером. Це може виглядати приблизно так: B |-- trackers |-- owners |-- owner_id |-- owner_type |-- tracker_id
  3. Зберігайте записи для кожної мікросервісу usersта trackersв кожній з них. Утримуйте їх у синхронізації з якоюсь системою pubsub.

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

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

Відповіді:


12

Перш за все, я б почав з опису домену. Ви не згадали, про що йдеться (я можу здогадатися, але це була б лише здогадка). Після цього я б спробував розкласти його за допомогою аналізу ланцюжків цінностей або відображення бізнес-можливостей . І лише після цього я б подумав про реалізацію.

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

Друга річ - це те, що ви, мабуть, недостатньо добре працювали над своїм доменом. Яке поняття представлено usersтаблицею? Це registered user, з усією інформацією та поведінкою, необхідною для реєстрації? Ви впевнені, що це правильна концепція для спілкування trackers(що б це не було)? Тож якщо я правильно зрозумів, ваш варіант 2 - саме про це: представити ownerконцепцію, яка наближається до вашого домену. Якщо це дійсно так, я також за варіант 2.

Однак, видається, що для мікросервісу B. це не виходить. Чому мікросервіс B повинен піклуватися про те, щоб мікросервіс A хотів створити асоціацію?

Вся справа в межах. Я думаю, ви хочете сформувати мікросервіси навколо сутностей. Ось де SOA провалився зі своєю шаруватою архітектурою обслуговування . Кращий підхід полягає у створенні сервісів, які представляють деяку ділову функцію, тому вони інкапсулюють як дані, так і поведінку. З більш практичної точки зору, мова йде про створення служб навколо бізнес-процесів або випадків використання. Наприклад, у вас може бути одна служба для реєстрації користувача. Він містить дані користувача та поведінку, необхідну для реєстрації користувача. Таким чином, концепція " userформується" природно, і вона належить лише службі А. І це приводить мене до наступного моменту: інший спосіб думати про послуги обмежений контекстом . Це хороша практика вирівнювання служб та обмеженого контексту.

Коли користувач зареєстрований, UserCreatedподія може бути передана. Ваша друга служба, я думаю, це зацікавила. Тож після отримання його може бути створена абсолютно інша сутність, скажімо, Ownerсутність (що б там не було). Я впевнений, що існує багато цікавих співпраць між нею та trackerсутністю - зберігайте їх в одній службі.

Будьте вкрай обережні з варіантом 3. Якщо ви копіюєте дані, функціональність наступна. Це призводить до тісного зчеплення. І не охоплюйте термін CQRS , мова не йде про синхронізацію даних між службами через події.


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

Я завжди включав чат-сервіси в категорію "розподілений моноліт", яка не є широко поширеним, поширеним способом.
Вадим Самохін

6

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

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

У сервісному дизайні структура інтерфейсу є найважливішим у дизайні. Насправді реалізація майже не має значення в порівнянні, особливо у випадку з мікропослугами. Причина полягає в тому, що після того, як ви поставите свою послугу, всі залежності від вашої послуги повинні існувати лише в інтерфейсі. Якщо ви правильно це зробите, ви зможете повністю переписати реалізацію без будь-якого споживача. І це головна перевага автономії. Нікого не цікавить, як ти його збудував. Їм просто потрібно, щоб вони працювали так, як ви повідомили, що так і буде.

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

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


0

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


0

Запитання: Чому ваші дані розділені уздовж Datatables?

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

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


Це частина релігії мікросервісів, що кожній службі потрібна повна автономія. Томас Ерл описує це як один із принципів орієнтації на обслуговування в "Принципи дизайну послуг" c. 2008.
JimmyJames

@ JimmyJames Як хтось, хто сам пише ms-архітектуру: існує багато дискусій щодо питання, якою має бути велика мс. У цьому випадку розмір може не мати значення навіть тому, що сервіс (и) можуть бути розділені неправильно - наприклад, не вирізати таблиці, не розрізати бізнес-домени.
Крістіан Зауер

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

@JimmyJames Я думаю, що мова може йти про технології - особливо коли сертифіковані технології добре підходять для деяких областей, а не для інших. Ми використовуємо C # і Python для своїх МС. Частина цього пов'язана з організаційними проблемами ("я програмував c # протягом 20 років, мені не потрібно вивчати новомодні нетипізовані мови!"). - але також обумовлений характером нашої системи. Частини даних даних найкраще виконати в python, тоді як деякі інфраструктурні та веб-завдання найкраще виконувати в C #.
Крістіан Зауер

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