Практическое задание#
В предыдущих модулях
- Определены домены и границы сервисов
- Зафиксированы архитектурные решения (ADR)
- Спроектированы контракты
- HTTP API
- Event-контракты
- Выбрана асинхронная коммуникация между сервисами
Сервисы развиваются независимо
- Сеть и брокер сообщений могут давать сбои
- Сообщения доставляются не гарантированно один раз
- Данные между сервисами могут расходиться
Задача этого модуля - научиться проектировать консистентность.
Домены
- Заказы
- Оплата
- Каталог
- Доставка
- Уведомления
Бизнес-требования
При создании заказа
- резервируется товар
- происходит оплата
- пользователь получает уведомлениеВажно
- Сервисы не имеют общей БД
- Синхронные вызовы между сервисами не запрещены
- То что возможно выполнить асинхронно, выполняется асинхронно
Часть 1: Анализ консистентности системы#
Проанализировать текущую архитектуру
- Какие системы какие гарантии могут использовать ACID vs BASE
- Какие вызовы должны быть синхронными, а какие могут быть асинхронными
- Где в системе нет атомарности
- Где данные могут разъехаться
- Какие операции можно повторять, а какие нельзя, как защититься, что делать с потерей данных
Артефакты
- Таблица выводов по каждому домену
- Что должно быть синхронным, а что асинхронным
- Гарантии домена
Часть 2. Dual write на практике#
В сервисе Orders реализовано
BEGIN
UPDATE orders
PUBLISH OrderCreated
COMMITАртефакты
- Описать минимум 3 сценария рассинхронизации
- Объяснить, почему не решают проблему
- retry
- transaction
- “у нас пока работает”
- Указать, какие сервисы первыми заметят ошибку
- Предложить решение проблемы
Часть 3. Реализовать Transactional Outbox#
- Спроектировать outbox для сервиса Orders.
- Какие данные хранятся в событии
- Понятно как определить
- Что событие опубликовано
- Что его можно публиковать повторно
- Poller упал
- Брокер недоступен
Артефакты
- Реализованное решение на вашем языке программирования
- Запись события в транзакции
- Обработка события джобой
- Очистка очереди сообщений
- Возможно использовать готовый фреймворк, тогда необходимо показать детали реализации