Приєднується мікросервіс та база даних


112

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

Якщо у вас є дві таблиці, які логічно відрізняються (якщо це буде обмежений контекст), але ви часто робите сукупну обробку на великих обсягах цих даних, то в моноліті ви, швидше за все, уникаєте орієнтації на об'єкт і замість цього використовуєте стандарт вашої бази даних ПРИЄДНАЙТЕ функцію, щоб обробити дані в базі даних, перш ніж повернути зведений вигляд назад у ваш рівень програми

Як ви виправдовуєте поділ таких даних на мікросервіси, де, імовірно, вам потрібно буде "об'єднати" дані через API, а не в базі даних.

Я читав книгу про мікросервіси Сема Ньюмена, і в главі про розщеплення моноліту він наводить приклад "Розриву зовнішніх ключових відносин", де він визнає, що робити з'єднання через API буде повільніше - але він продовжує говорити, якщо ваш додаток досить швидкий, чи не важливо, що він повільніше, ніж раніше?

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


2
Добре запитання, я переживаю ту саму проблему, і я перетворився на матеріалізований погляд і приєднався до цього. Мені це не подобається, але я думаю, що це стане проблемою для Micro Services. Немає правильного способу зробити це, це лише вибір дизайну, який слід зробити. Я знаю, що багато людей кажуть, що ми можемо мати матеріалізований погляд, але сукупні відповіді стають проблемою. Повідомте мене, якщо ви знайшли щось краще.
PavanSandeep

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

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

Відповіді:


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

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

  • Крім того, не забувайте про кешування :) Ви можете використовувати такі інструменти, як Redis або Memcached, щоб не часто запитувати інші бази даних.


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

1
Так, я бачу. Підхід до мікросервісів не для всіх, і слід застосовувати його обережно. Можливо, ви можете почати з менших змін.
sap1ens

Ймовірно, програмістам StackExchange було б краще місце, щоб задати це питання: programmers.stackexchange.com/questions/279409/… та інші питання з тегами мікросервісів programmers.stackexchange.com/questions/tagged/microservices
Martin Bayly

9

Добре, щоб сервіси мали копії певних довідкових даних з інших служб лише для читання.

Враховуючи, що, намагаючись переробити монолітну базу даних в мікросервіси (на відміну від переписання), я б

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

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

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

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

* перегляди можна продовжити. Якщо потрібна перервна зміна, створіть v2 того самого перегляду та видаліть стару версію, коли вона більше не потрібна. ** або Функції з оцінкою таблиці або Sprocs.


5

CQRS --- Шаблон агрегування запитів команд - це відповідь, як за Крісом Річардсоном. Нехай кожна мікросервіс оновлює власну Модель даних та генерує події, які оновлюватимуть матеріалізований вигляд із необхідними даними з'єднання з попередніх мікросервісів. Цей MV може бути будь-якою БД NoSql або Redis або elastsearch, яка оптимізована за запитами. Ця методика призводить до консистенції у події, яка, безумовно, не є поганою та дозволяє уникнути приєднання до сторони додатків у реальному часі. Сподіваюся, що це відповідає.


2

Я б розділив рішення щодо сфери використання, скажімо, оперативних та звітних.

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

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


1

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

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

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