Децентралізоване управління даними - інкапсуляція баз даних у мікросервіси [закрито]


23

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

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

Більш викладене та більш детальне пояснення цьому можна знайти тут: http://martinfowler.com/articles/microservices.html у розділі Децентралізоване управління даними.

найяскравіша частина про це говорить:

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

Малюнок 4введіть тут опис зображення

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


6
Я не впевнений, як це питання виходить за межі для програмістів.stackexchange. Це питання щодо конкретної методики та її плюсів і мінусів, щоб визначити, коли використання цієї техніки заслуговує. Я переглянув тур і мета-сайт ( meta.stackexchange.com/questions/68384/… ). Не могли б ви пояснити, як мені вдосконалити питання?
ThinkBonobo

Відповіді:


35

Давайте поговоримо про позитиви та негативи мікросервісного підходу.

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

Дозвольте проілюструвати справжній мінус. Розглянемо гіпотетично випадок, коли у вас створюється 100 мікросервісів під час створення сторінки, кожна з яких робить правильно 99,9% часу. Але 0,05% часу вони дають неправильні результати. І 0,05% часу виникає запит на повільне підключення, коли, скажімо, потрібен час очікування TCP / IP для підключення, і це займає 5 секунд. Близько 90,5% часу ваш запит працює бездоганно. Але приблизно в 5% часу ви маєте неправильні результати і приблизно 5% часу ваша сторінка повільна. І кожен невідтворюваний збій має різну причину.

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

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

То як щодо того монолітного підходу?

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

Добре, тоді чому компанії йдуть на підхід до мікросервісів?

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

Моє особисте правило полягає в тому, що перехід від коду на мові сценаріїв (наприклад, Python) до оптимізованого C ++, як правило, може поліпшити 1-2 порядки як на продуктивність, так і на використання пам'яті. Інший шлях до розподіленої архітектури додає величини вимогам до ресурсів, але дозволяє масштабувати нескінченно. Можна зробити розподілену архітектурну роботу, але зробити це складніше.

Тому я б сказав, що якщо ви починаєте особистий проект, будьте монолітними. Дізнайтеся, як це зробити добре. Не розповсюджуйтесь, тому що (Google | eBay | Amazon | тощо) є. Якщо ви приземляєтесь у великій компанії, яка розповсюджується, зверніть пильну увагу на те, як вони змушують її працювати, а не збивайтеся з цього. А якщо вам доведеться робити перехід, будьте дуже, дуже обережними, оскільки ви робите щось важке, що легко зрозуміти дуже, дуже неправильно.

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


3
Надзвичайно прониклива відповідь. Дякую, що передали цю мудрість.
ThinkBonobo

Ось нещодавня розмова Мартіна Фаулера (третя), яка стосується кількох із цих моментів.
Whymarrh

Чи існує спосіб між монолітом та мікропослугами? У мене є багатостороннє застосування моноліту. Через деякий час я бачу, що я повинен ділитися на орендаря. Кожен орендар повинен мати власний екземпляр заявки, але вони повинні ділитися деякими даними, і це повинно бути єдине / центральне місце. Отже, я можу створити окремий сервіс спеціально для цього. Схоже, у мене буде пара (не настільки мікро) додатків / послуг. Чи звучить розумно робити це саме так?
dariol

@dariol Немає хорошого шляху оновлення від монолітного до повного мікросервісу через середину "ми скрізь завантажуємо велику загальну базу коду, а потім використовуємо те, що нам потрібно від неї". Однак розумно це робити як тимчасовий пластир, щоб отримати негайну потребу. А потім починайте розщеплювати реальні мікросервіси, поки не зможете замінити ядро. Причина, по якій це важко, пов'язана з управлінням залежностями. Ви продовжуватимете бити: "Мені просто це потрібно, але це залежить від цього, залежить від цього ... і тепер у мене є вся куля спагетті".
btilly

Ще одне посилання від Мартіна Фаулера на цю тему: Моноліт Перший
driftcatcher

5

Я від усієї думки погоджуюся з відповіддю btilly, але просто хотів додати ще один позитив для Microservices, який, на мою думку, стоїть за цим оригінальним натхненням.

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

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

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


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

2

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

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

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

Роджер Сеанс у своїх відмінних інформаційних бюлетенях Objectwatch описав щось подібне з його концепцією Software Fortresses (на жаль, бюлетені більше не в Інтернеті, але ви можете придбати його книгу).

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