Повествования, основанные на хореографии.¶
Хореография — способ реализации повествований, когда участники подписываются на события друг друга и реагируют соответствующим образом.
Сперва рассмотрим пример — повествование createOrder().
Пример: повествование CreateOrder¶
Оптимистичный путь:¶
- Сервиc
Orderсоздает заказ с состояниемAPPROVAL_PENDINGи публикует событиеOrderCreated. - Сервис
Consumerпотребляет событиеOrderCreated, проверяет, может ли заказчик размещать заказы и публикует событиеConsumerVerified. - Сервис
Kitchenпотребляет событиеOrderCreated, проверяет заказ, создает заявку с состояниемCREATE_PENDINGи публикует событиеTicketCreated. - Сервис
Accountingпотребляет событиеOrderCreatedи создает объектCreditCardAuthorizationс состояниемPENDING. - Сервис
Accountingпотребляет событияTicketCreatedиConsumerVerified, выставляет счет банковской карте заказчика и публикует событиеCreditCardAuthorized. - Сервис
Kitchenпотребляет событиеCreditCardAuthorized, меняет состояние заявки наAWAITING_ACCEPTANCE. - Сервис
Orderпотребляет событиеCreditCardAuthorized, меняет состояние заказа наAPPROVEDи публикует событиеOrderApproved.
Неудачный путь¶
Предположим, авторизация банковской карты завершилась неудачей.

1. Сервиc Order создает заказ с состоянием APPROVAL_PENDING и публикует событие OrderCreated.
2. Сервис Consumer потребляет событие OrderCreated, проверяет, может ли заказчик размещать заказы и публикует событие ConsumerVerified.
3. Сервис Kitchen потребляет событие OrderCreated, проверяет заказ, создает заявку с состоянием CREATE_PENDING и публикует событие TicketCreated.
4. Сервис Accounting потребляет событие OrderCreated и создает объект CreditCardAuthorization с состоянием PENDING.
5. Сервис Accounting потребляет события TicketCreated и ConsumerVerified, выставляет счет банковской карте заказчика и публикует событие CreditCardAuthorizationFailed.
6. Сервис Kitchen потребляет событие CreditCardAuthorizationFailed, меняет состояние заявки на REJECTED.
7. Сервис Order потребляет событие CreditCardAuthorizationFailed, меняет состояние заказа на REJECTED.
Как мы видим, участники взаимодействуют в стиле “издатель/подписчик”.
Надежное взаимодействие на основе событий¶
При реализации хореографии необходимо учитывать следующее. Во-первых, следует сделать так, чтобы участники обновляли свои базы и публиковали события в рамках транзакций БД. Во-вторых, участники должны иметь возможность сопоставить каждое событие с собственными данными, поэтому важно публиковать события с идентификаторами соответствия.
Преимущества¶
- Простота. Сервисы публикуют события при создании, обновлении и удалении бизнес-объектов.
- Слабая связанность. Участники подписываются на события, не владея непосредственной информацией друг о друге
Недостатки¶
- Сложность для понимания. В отличие от оркестрации хореография не описывает повествование одним участком кода — его реализация разбросана между сервисами. Из-за этого может быть сложно понять, как работает то или иное повествование.
- Риск возникновения циклических зависимостей.
- Риск жёсткого связывания.
Дата создания : 26 июля 2022 г.
