Деякі варіанти.
Використовуйте стійкий канал зв'язку
Замість HTTP викидайте повідомлення у чергу, яка є дуже доступною та стійкою. Наприклад, Кафка. Поки цільовий сервер стане доступним в якийсь момент, він отримає повідомлення.
Зараз у вас є компроміс із забезпечення та адміністрування складної підсистеми (черги). Тому не забудьте проаналізувати, чи варто це.
Баккофф і повтори
Попросіть абонента зберегти невдалий запит (можливо, зберігається на диску) та періодично повторювати його. У цьому випадку важливо розрізняти ваш запит, що спричиняє збій, а сервіс - лише відключення. Перший, ймовірно, пов’язаний з помилкою, і його слід ввійти в журнал ... спроби, ймовірно, не матимуть значення, поки виправлення не буде зроблено.
Виявити та компенсувати
Періодичне завдання перевіряє на предмет узгодженості між мікросервісами. Наприклад, помилка записує весь шлях до безпосереднього керування запитами API. Якщо вона виявить проблему (наприклад, є замовлення, але доставка ніколи не отримала список упаковки), виконайте кроки компенсації. Ці кроки можуть бути створенням квитка підтримки для виправлення вручну або надсиланням електронної пошти комусь чи будь-чому іншому.
Розгляньте альтернативи дизайну
Такий випадок, ймовірно, вимагає створення шлюзу API для управління дзвінками до постраждалих мікросервісів. Таким чином ви контролюєте, яку тактику застосовуєте для пом'якшення цієї проблеми. Напевно, ви не хочете обтяжувати клієнтів тими деталями впровадження. Дивіться схему вимикача .
Оскільки мікросервіси незалежні, завжди буде якийсь випадок відмови, який може призвести до непослідовності. Ви повинні бути готові робити ручні виправлення, коли вони виникають.
Якщо вам потрібна міцна консистенція, то мікросервіси не будуть добре підходити. Якщо все-таки потрібна масштабованість, ви можете заглянути в загострення, де пов'язані дані можуть бути розміщені на одному фрагменті для гарантій узгодженості. Ви все ще можете масштабувати IO, додаючи фрагменти.
Якщо вам потрібна міцна послідовність і не маєте проблем зі масштабуванням, тоді просто скористайтеся послугами моноліту. Використовуйте бібліотеки як межі вашої програми, щоб розділити проблеми.