Шаблон хореографии

Шаблон хореографии децентрализует логику рабочего процесса и распределяет обязанности между другими компонентами системы. Вместо того чтобы зависеть от центрального оркестратора, службы решают, когда и как обрабатывать бизнес-операцию.

Контекст и проблема

Обычно вы разделяете облачное приложение на несколько небольших служб, которые работают вместе для обработки сквозной бизнес-транзакции. Одна операция в транзакции может привести к нескольким точечным вызовам между всеми сервисами. В идеале эти службы слабо связаны. Сложно разработать распределенный, эффективный и масштабируемый рабочий процесс, так как он включает сложные взаимодействия между службами.

Распространенный шаблон взаимодействия — использовать централизованную службу или оркестратор. Входящие запросы передаются через оркестратор по мере делегирования операций соответствующим службам. Каждая служба выполняет свою ответственность и не знает об общем рабочем процессе.

Схема рабочего процесса, использующего центральный оркестратор для обработки запросов.

Обычно вы реализуете шаблон оркестратора в виде пользовательского программного обеспечения, имеющего знания о доменах обязанностей служб в системе. Один из преимуществ этого подхода заключается в том, что оркестратор может консолидировать состояние транзакции на основе результатов отдельных операций, которые выполняют подчиненные службы.

Этот подход также создает некоторые препятствия. Добавление или удаление служб может нарушить существующую логику, так как требуется повторно развернуть части пути связи. Эта зависимость делает реализацию оркестратора сложной и сложной для поддержания. Оркестратор может отрицательно повлиять на надежность рабочей нагрузки. Под нагрузкой она может привести к узким местам производительности и быть единственной точкой сбоя (SPoF). Это также может привести к каскадным сбоям в подчиненных службах.

Решение

Делегировать логику обработки транзакций между службами. Пусть каждая служба участвует в рабочем процессе коммуникации для бизнес-операции и решает, когда и как ее обрабатывать.

Шаблон хореографии минимизирует зависимость от специализированного программного обеспечения, централизующего процесс взаимодействия. Компоненты реализуют общую логику, хореографируя рабочий процесс между собой, не взаимодействуя друг с другом напрямую.

Распространенный способ реализации хореографии — использовать брокер сообщений, который буферизует запросы до их принятия и обработки нижестоящими компонентами. На следующем рисунке показана обработка запросов с помощью модели подписчика издателя.

Схема, показывающая, как брокер сообщений обрабатывает запрос.

  1. Клиент запрашивает очередь, состоящую из сообщений, в брокере сообщений.

  2. Службы или подписчик опрашивает брокера, чтобы определить, может ли он обрабатывать это сообщение на основе его реализованной бизнес-логики. Брокер также может отправлять сообщения подписчикам, заинтересованным в этом сообщении.

  3. Каждая подписавшаяся служба выполняет свою операцию в соответствии с указаниями сообщения и отвечает брокеру сообщением о успехе или неудаче операции.

  4. Если операция выполнена успешно, служба может отправить сообщение обратно в ту же очередь или другую очередь сообщений, чтобы другая служба продолжала рабочий процесс при необходимости. Если операция завершается ошибкой, брокер сообщений работает с другими службами для компенсации этой операции или всей транзакции.

Проблемы и рекомендации

Учитывайте следующие моменты при принятии решения о том, как реализовать этот шаблон.

Когда следует использовать этот шаблон

Используйте этот шаблон, когда:

  • Подчиненные компоненты обрабатывают атомарные операции независимо. Подумайте об этом шаблоне как о механизме "выстрелил и забыл", в котором компонент выполняет задачу, не требующую активного управления. По завершении задачи компонент отправляет уведомление другим компонентам.

  • Вы ожидаете часто обновлять и заменять компоненты. Этот шаблон позволяет изменять приложение с меньшими усилиями и минимальными нарушениями существующих служб.

  • Бессерверные архитектуры используются для простых рабочих процессов. Компоненты могут быть кратковременными и управляемыми событиями. При возникновении события служба создает компоненты, выполняющие задачу, и служба удаляет компоненты после завершения этой задачи.

  • Для обмена данными между ограничивающими контекстами требуется свободное связывание между границами домена. Для обмена данными в одном ограниченном контексте вместо этого примените шаблон оркестратора.

  • Центральный оркестратор представляет узкие места в производительности.

Этот шаблон может быть не подходит, если:

  • Приложение является сложным и требует центрального компонента для управления общей логикой, чтобы поддерживать лёгкость компонентов на нижестоящих уровнях.

  • Обмен данными между компонентами неизбежен.

  • Необходимо использовать бизнес-логику для консолидации всех операций, которые обрабатывают подчиненные компоненты.

Проектирование рабочей нагрузки

Оцените, как использовать шаблон хореографии в проектировании рабочей нагрузки для решения целей и принципов, описанных в основных принципах Azure Well-Architected Framework. В следующей таблице приведены рекомендации по использованию этого шаблона для целей каждого компонента.

Столп Как этот шаблон поддерживает цели основных компонентов
Операционное превосходство помогает обеспечить качество рабочей нагрузки через стандартизированные процессы и сплоченность команды. Распределенные компоненты в этом шаблоне являются автономными и предназначены для замены, поэтому вы можете изменить рабочую нагрузку с меньшим общим изменением в системе.

- Инструменты и процессы OE:04
Эффективность производительности помогает рабочей нагрузке эффективно соответствовать требованиям путем оптимизации масштабирования, данных и кода. Этот шаблон предлагает альтернативу при возникновении узких мест производительности в централизованной оркестрационной топологии.

- Планирование емкости PE:02
- Pe:05 Масштабирование и секционирование

Если этот шаблон вводит компромиссы внутри столпа, рассмотрите их против целей других столпов.

Пример

В этом примере показан шаблон хореографии путем создания управляемой событиями облачной рабочей нагрузки, которая выполняет функции вместе с микрослужбами. Когда клиент запрашивает отправку пакета, рабочая нагрузка назначает дрон. После того как пакет будет готов к сбору с помощью запланированного дрона, процесс доставки начинается. Пока пакет находится в пути, рабочая нагрузка обрабатывает доставку, пока она не получит статус "отправлено".

Схема управляемой событиями облачной рабочей нагрузки, реализующей шаблон хореографии.

Служба приема получает клиентские запросы и преобразует их в сообщения, содержащие сведения о доставке. Бизнес-транзакции начинаются после того, как службы используют эти новые сообщения.

Для одной бизнес-транзакции клиента требуется три отдельных бизнес-операций:

  • Создание или обновление пакета.

  • Назначьте беспилотный летательный аппарат для доставки пакета.

  • Обработка доставки, включая проверку и отправку уведомления при отправке пакета.

Пакеты, планировщик дронов и микрослужбы доставки выполняют бизнес-обработку. Службы используют обмен сообщениями вместо центрального оркестратора для взаимодействия друг с другом. Каждая служба должна заранее реализовать протокол, который координирует рабочий процесс в децентрализованном порядке.

Проектирование

Службы последовательно обрабатывают бизнес-транзакции через несколько этапов. Каждый прыжок использует общую шину сообщений среди всех бизнес-сервисов.

Когда клиент отправляет запрос доставки через конечную точку HTTP, служба приема получает его, преобразует его в сообщение, а затем публикует сообщение в общей шине сообщений. Подписавшиеся бизнес-сервисы потребляют новые сообщения, добавленные в шину. Когда бизнес-служба получает сообщение, она успешно завершает операцию, или запрос завершается сбоем или истекает время ожидания. Если запрос выполнен успешно, служба отвечает на шину с Ok кодом состояния, создает новое сообщение операции и отправляет его в шину сообщений. Если запрос завершается сбоем или истекает время ожидания, служба сообщает о сбое, отправив код причины в шину сообщений, а затем добавляет сообщение в очередь недоставленных писем (DLQ). Служба также перемещает сообщения, которые не могут получать или обрабатывать в течение определенного периода времени в DLQ.

Эта конструкция использует несколько автобусов сообщений для обработки всей бизнес-транзакции. Служебная шина Azure и Сетка событий Azure предоставляют платформу службы обмена сообщениями для этой структуры. Рабочая нагрузка выполняется в приложениях контейнеров Azure, где размещаются функции Azure для приема. Контейнерные приложения обрабатывают обработку на основе событий , которая выполняет бизнес-логику.

Этот дизайн также гарантирует, что хореография выполняется в последовательности. Одно пространство имен служебной шины содержит тему с двумя подписками и очередь с поддержкой сеансов. Служба приема публикует сообщения в разделе. Служба доставки и служба планировщика дронов подписываются на тему и публикуют сообщения, которые уведомляют очередь об успешных запросах. Включите общий идентификатор сеанса, который связывает GUID с идентификатором доставки, чтобы службы могли обрабатывать несвязанные последовательности связанных сообщений по порядку. Служба доставки ожидает двух связанных сообщений для каждой транзакции. Первое сообщение указывает, что пакет готов к отправке, а второй — сигнал о том, что беспилотный летательный аппарат запланирован.

В этой структуре служебная шина обрабатывает сообщения с высоким значением, которые не должны быть потеряны или дублируются во время всего процесса доставки. Когда пакет отправляется, изменение состояния публикуется в Сетке событий. У отправителя события нет ожидания о том, как обрабатывается изменение состояния. Подчиненные службы организации, которые эта конструкция не включает в себя, могут прослушивать этот тип события и выполнять определенную бизнес-логику, например отправку сообщения электронной почты о состоянии заказа пользователю.

При развертывании этого шаблона в другой вычислительной службе, например AKS, можно реализовать шаблон приложения Publisher-Subscriber с двумя контейнерами в одном модуле pod. Один контейнер запускает амбассадор, взаимодействующий с выбранной шиной сообщений, а другой контейнер выполняет бизнес-логику. Такой подход повышает производительность и масштабируемость. Посол и бизнес-служба совместно используют ту же сеть, что снижает задержку и увеличивает пропускную способность.

Чтобы избежать каскадных повторных операций, которые могут привести к нескольким попыткам, бизнес-службы должны немедленно пометить неприемлемые сообщения. Усовершенствуйте эти сообщения, используя коды общих причин или определенный код приложения, чтобы службы могли перемещать их в DLQ. Рассмотрите возможность реализации шаблона Saga для управления проблемами согласованности из подчиненных служб. Например, другая служба обрабатывает сообщения о недоставленных письмах только путем выполнения компенсации, повторных попыток или сводной транзакции.

Службы для бизнеса неизменяемы, чтобы гарантировать, что операции повторных попыток не создают дублирующие ресурсы. Например, служба пакетов использует операции upsert для добавления данных в хранилище данных.

Дальнейшие действия

Рассмотрим эти шаблоны в дизайне для хореографии:

  • Модульная структура бизнес-службы с помощью шаблона послов.

  • Реализуйте шаблон выравнивания нагрузки на основе очереди для обработки пиков рабочей нагрузки.

  • Используйте асинхронный распределенный обмен сообщениями с помощью шаблона Publisher-Subscriber.

  • Используйте компенсирующие транзакции для отмены ряда успешных операций при сбое одной или нескольких связанных операций.