Ответ
Один из самых сложных кейсов — миграция монолитного банковского приложения на микросервисную архитектуру с нулевым даунтаймом.
Проблемы:
- Нагрузка 24/7, нельзя просто остановить систему.
- Сложные транзакции между модулями (например, платежи и балансы).
- Нужно было обеспечить консистентность данных при параллельной работе старой и новой систем.
Решение:
- Двухфазный деплой — сначала читаем из нового сервиса, но пишем в оба (write-through).
- Саги для распределённых транзакций (компенсационные действия при ошибках).
- Постепенная миграция по функционалу, а не по модулям.
Пример кода (сага на псевдокоде):
def transfer_money(saga_id, from_acc, to_acc, amount):
try:
debit(from_acc, amount)
credit(to_acc, amount)
saga_log(saga_id, "COMPLETED")
except Exception as e:
refund(from_acc, amount) # Компенсация
saga_log(saga_id, "FAILED", str(e))
Итог: Миграция заняла 9 месяцев, но клиенты даже не заметили изменений.