Практическое задание#

В предыдущих модулях

  • Определены домены и границы сервисов
  • Зафиксированы архитектурные решения (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 упал
    • Брокер недоступен

Артефакты

  • Реализованное решение на вашем языке программирования
    • Запись события в транзакции
    • Обработка события джобой
    • Очистка очереди сообщений
  • Возможно использовать готовый фреймворк, тогда необходимо показать детали реализации

Контакты#

Поддержать автора