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


12

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

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

Як мені це зробити? Я не хочу осиротілих даних у різних базах даних.


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

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

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

Залежно від обсягу потоку даних, я застосував диспетчер черг, який повторює передачу, поки не буде повідомлено про успіх або не надсилає повідомлення про помилку та надсилає SMS-повідомлення про відключення. Я думаю, це також трохи залежатиме від очікуваного вікна відключення (як довго).
htm11h

Це для чогось подібне rabbitmq?
Johnny

Відповіді:


9

Деякі варіанти.

Використовуйте стійкий канал зв'язку

Замість HTTP викидайте повідомлення у чергу, яка є дуже доступною та стійкою. Наприклад, Кафка. Поки цільовий сервер стане доступним в якийсь момент, він отримає повідомлення.

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

Баккофф і повтори

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

Виявити та компенсувати

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

Розгляньте альтернативи дизайну

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

Оскільки мікросервіси незалежні, завжди буде якийсь випадок відмови, який може призвести до непослідовності. Ви повинні бути готові робити ручні виправлення, коли вони виникають.

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

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


Це для чого RabbitMQ?
johnny

RabbitMQ - це відповідь на ваше запитання? Ні. Це може бути частиною рішення, яке відповідає вашим потребам, але вирішити вашу проблему не вдасться самостійно.
Спікер Кейсі

Просто записка. Я думаю, що RabbitMQ не зберігає повідомлення. Він споживається та видаляється з черги, тому НІ. Якщо вам потрібна наполегливість і повторіть спробу, RabbitMQ не допоможе.
Лаїв

2

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

http://the-paper-trail.org/blog/consensus-protocols-two-phase-commit/

http://the-paper-trail.org/blog/consensus-protocols-three-phase-commit/

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