Чи повинні служби спілкуватися безпосередньо між собою в архітектурі мікросервісу?


10

У мене є ряд веб-служб, які формують веб-додаток. Клієнти можуть отримати доступ до цих послуг через дзвінки API REST.

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

Якщо клієнт повинен зателефонувати їм один за одним, щоб отримати необхідні йому дані для завантаження веб-сторінки на клієнта?

Або я повинен мати ще один шар поверх своїх послуг, який обробляє запит від клієнта, отримує дані для цього запиту і потім надсилає його назад клієнту?


Якщо речі повністю нероз'єднані, то це абсолютно окремі продукти. Таким чином, користувачеві доведеться увійти в систему Contoso Login, тоді Contoso Login скаже «Ви зараз увійшли в систему!» ... і тоді вони перейдуть до Contoso Sensitive Data Storage, поставте галочку з написом «Так, я ввійшов у систему "... потім скопіюйте та вставте дані з цього в процесор даних Contoso ...
користувач253751,

Відповіді:


16

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

Зрештою, у вас з’явиться додаток для мікросервісів, який повільніше, ніж це було б альтернативне монолітне додаток, але майже все ті ж проблеми!

Я повинен не погодитися з @Robert Harvey

На практиці, однак, один або кілька ваших мікросервісів (можливо, всі вони) спілкуватимуться з деяким центральним сховищем даних, таким як база даних SQL.

Інтеграційна база даних є добре відомою антипатернією

Набагато кращим рішенням є використання моделі публікації та підписки, щоб зробити зв’язок між вашими службами асинхронним:

введіть тут опис зображення

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

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


2
Ну, по-перше, я ніде не чув терміна "інтеграційна база даних", окрім Фоулера. Не сприймайте щось як євангелію лише тому, що сказав один хлопець. По-друге, у вас недостатньо інформації, щоб називати те, що я описав, "інтеграційною базою даних". По-третє, Фаулер насправді називає такі бази даних корисними за правильних обставин у тій самій статті, яку ви пов’язали. Мені подобається ідея шини подій, хоча я не бачу, як це все так інакше, ніж викликати звичайний API мікросервісу, якщо ви не зможете підвищити ефективність.
Роберт Харві

Дякую, Роберт, я пов’язав статтю Фоулера, щоб краще проілюструвати ідею, а не сперечатися з авторитетом. Те, як ви описали такий підхід, дуже схоже на інтеграційну базу даних. Якщо це інакше - це зовсім не очевидно. Що стосується правильних обставин - я вважаю, що інтегрувати мікросервіси через базу даних не є хорошою ідеєю, оскільки це відштовхує нас до монолітної архітектури.
IlliakaillI

1
Впевнений: кожен мікросервіс розмовлятиме з власною окремою базою даних або з таблицями в одній базі даних, які не пов'язані з таблицями інших служб. Таким чином сервіси ніколи не обмінюються інформацією через базу даних, а це означає, що ви можете легко масштабувати горизонтально і буде набагато менше вузьких місць. А оскільки вони не діляться одними і тими ж таблицями - зміни в одній частині додатку менше впливатимуть на інші частини.
IlliakaillI

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

1
Але щоб досягти ділової цінності, ви хочете об'єднати дані - "покажіть мені всі каналізаційні системи, які матимуть недостатню ємність для зберігання даних, враховуючи наведені нижче радіолокаційні дані про дощ, що надходить, та розфарбуйте цю карту муніципалітетів, використовуючи результат". Якщо ви розділите всі свої дані на сервіси, це просто означає, що ви можете об'єднати дані лише пізніше. Якщо ви забороняєте службам спілкуватися один з одним, ви просто змушуєте себе перенести всі дані до якогось клієнта та приєднатись до цих даних. Ви ХОЧЕТЕ десь спаровувати дані, тому що в кінцевому підсумку дає значення додатку.
RemcoGerlich

8

Ви отримаєте багато дуже хороших ідей, прочитавши, що Уді Дахан має сказати про SOA .

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

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

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

Зокрема, що стосується складу інтерфейсу, стаття Мауро Сервієнті про склад інтерфейсу є гарною відправною точкою. Дивіться також відео Уді, доступне тут .

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

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

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


7

Це залежить від того, що ви маєте на увазі під «безпосередньо».

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

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


це не добре і матиме погані наслідки. Дивіться мою відповідь для отримання більш детальної інформації.
IlliakaillI

@IlliakaillI Я кажу, що це добре "відповідно до архітектури мікросервісів". Я не припускаю, що архітектура мікросервісів не має наслідків, або що немає вдосконалень, які можна зробити для цього. Питання тут - це "X за книгою, чи ні?" і правильна відповідь полягає в тому, що з огляду на правильне визначення Х, це за книгою.
Майк Накіс

Чи є "довідник", який розповість, як побудувати справжню "архітектуру мікросервісів"? В даний час мікросервіси стають модним словом, і багато людей писали книги про те, як будувати моноліти поверх REST. Подивіться на цю першу діаграму в моїй відповіді, немає сенсу будувати систему таким чином. Якщо ви робите з якоїсь дивної причини - ви точно робите це неправильно. Тобі краще піти з монолітом. Якщо ви підтримуєте свій вибір дизайну, сліпо посилаючись на деякі книги (аргументуючи владні аргументи), це не правильний підхід до розробки програмного забезпечення.
IlliakaillI

5

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

З’єднання не є поганим словом. Кожна програма вже має певний ступінь зв'язку; програми, які спілкуються з вашими мікросервісами, вже поєднані з мікросервісами, інакше вони не працюватимуть.

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

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


3
"Інтеграційна база даних" є добре відомою антипатернією, див. Мою відповідь для отримання більш детальної інформації.
IlliakaillI

2

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

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


1

Якщо клієнт повинен зателефонувати їм один за одним, щоб отримати необхідні йому дані для завантаження веб-сторінки на клієнта?

Це залежить; однак я б запропонував надати клієнтам безпосередньо корисні можливості та приховати (інкапсулювати) деталі того, як збираються результати (наприклад, за допомогою декількох мікросервісів).

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

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


(Крім того, поїздки до клієнта, ймовірно, дорожчі, ніж у ваших мікросервісів один до одного.)


Наприклад, якщо ви подивитеся на напрямок, який веде GraphQL, ви знайдете клієнтів, які видають безпосередньо відповідні запити до кінцевої точки, які можуть бути, а можуть і не бути реалізовані як набір мікрослужб. Оскільки архітектура мікросервісів прихована за GraphQL, це робить архітектуру простішою для рефакторингу, а також більш зручною для клієнта. Дивіться, наприклад, https://stackoverflow.com/a/38079681/471129 .


1

Основна мета мікропослуг - зробити вашу заявку вільно пов'язаною. Тому служби не можуть телефонувати один одному. В іншому випадку він буде зв'язаний між собою. Але що ми будемо робити, якщо у нас є два сервіси, які потребують обміну даними? Відповідь - Брокер повідомлень. Таким чином, служба, яка отримує дані від клієнта, може обмінюватися даними з центральним брокером повідомлень, тоді сервіси повинні використовувати ці дані, щоб їх споживати, перетворювати та розміщувати у власне сховище даних. Я рекомендую Kafka, тому що ви можете приєднатись до даних з різної тематики під час польоту Kafka Stream. PS. краще розділити свої мікропослуги за функціями.

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