Для унификации обмена сообщениями между кластерами системы CSS-17 применяется обмен через интеграционную шину, которую обеспечивает кластер Bus.Обмен сообщениями осуществляется по протоколу AMQP версии 0-10. Со спецификациями протокола AMQP версии 0-10 можно ознакомиться по ссылке: http://www.amqp.org/sites/amqp.org/files/amqp0-10.zip.
Далее будут рассмотрены механизмы, которые используются в CSS-17 при взаимодействии через Bus.
AMQP является протоколом, ориентированным на передачу сообщений через очередь с поддержкой механизмов транзакционности и гарантии доставки.Брокером AMQP называется сервер, который выполняет функции приема, маршрутизации, хранения сообщения в очереди и доставки сообщения получателю.В AMQP различают клиента отправителя (Publisher) и клиента получателя (Consumer) сообщения.Точка обмена (Exchange) выполняет функции маршрутизации сообщения при получении его брокером от отправителя. Целью "exchange" является определение того, в какую очередь должно быть доставлено каждое сообщение на основании транспортных параметров сообщения.
Свойство транзакционности и гарантии доставки, поддерживаемое протоколом AMQP, позволяет гарантировать как доставку сообщения от отправителя до брокера с одной стороны, так и доставку от брокера до получателя с другой. При этом поддерживаются механизмы подтверждения доставки сообщения до всех нод кластера в случае схем с резервированием.
Типовой процесс доставки сообщения по протоколу AMQP можно отобразить следующим образом:
Отправитель | == | отправка | ==> | Точка обмена | == | маршрутизация | ==> | Очередь | == | доставка | ==> | Получатель |
(Publisher) | (publish) | (Exchange) | (route) | (Queue) | (consumes) | (Consumer) |
В процессе отправки сообщения отправитель устанавливает для сообщения различные параметры, которые влияют на процесс обработки и доставки сообщения.Ключевыми параметрами, которые используются в CSS-17, являются:
Точка обмена (Exchange).
Протокол AMQP регламентирует несколько типов точек обмена, которые отличаются принципами маршрутизации поступающих в них сообщений.Поддерживаются следующие типа точек обмена:
В системе CSS-17 используется Direct Exchange.
В Direct Exchange маршрутизация входящих сообщений осуществляется в очереди на основании значения параметра "routing key" сообщения. Этот тип точки обмена идеален для организации unicast-потоков обмена сообщениями (можно организовать и multicast обмен).Direct Exchange работает следующим образом:
Direct exhange часто используется в ситуациях, когда нужно распределять задачи между несколькими однотипными обработчиками в режиме распределения нагрузки (round robin).
Схематически работа Direct exhcnage:
| ==Msg1==> Consumer1 | |
== Msgs ==> Direct exhcnage == Msgs.rk1 ==> Queue1 | | ==Msg2==> Consumer2 |
| ==Msg3==> Consumer3 |
Очередь (Queue).
Очереди в AMQP очень похожи на очереди в других системах доставки сообщений или обработки задач и представляют собой накопитель сообщений, работающий по принципу FIFO (First In First Out).Часть параметров очередь наследует от точки обмена, а также обладает следующими индивидуальными параметрами:
Для того чтобы очередь можно было использовать её необходимо задекларировать (declare). Декларация очереди ведет к её созданию, если очереди с таким именем и тем же набором атрибутов не существует. Декларация очереди не происходит, если уже существует очередь с именно таким именем и набором атрибутов (очередь уже существует, декларация считается успешно выполненной). Если же происходит декларация очереди и определяется, что очередь с таким именем, но отличающимся набором параметров, уже существует - возвращается ошибка "PRECONDITIONS_FAILED".
AMQP 0-10 определяет следующие общие правила именования очередей:
В системе CSS-17 применяются следующие дополнительные правила именования очередей:
В настоящий момент используются следующие общие правила формирования имен очередей:
Правила связывания (Bindings).
Bindings - это правила связывания/маршрутизации, которые используются в точке обмена для маршрутизации сообщений в очереди.Для того чтобы точка обмена E могла направлять сообщения в очередь Q необходимо, чтобы Q была связана с E.Правило связывания может иметь дополнительный "routing key" атрибут, который используется в некоторых типах точек обмена.Назначение "routing key" в том, чтобы выбрать определенные сообщения, размещенные в "exchange", и направить их в соответствующую очередь. Таким образом, "routing key" работает как фильтр.
Если сообщение не может быть смаршрутизировано в точке обмена (например, нет соответствующего правила связывания), то оно отбрасывается либо возвращается отправителю (зависит от настроек атрибутов сообщения).
Получатели (Consumers).
Получатель подписывается на сообщения определенной очереди. На сообщения очереди может быть подписано несколько получателей.Также предусмотрен механизм эксклюзивной подписки на очередь, тогда получатель сообщений у очереди может быть только один.
Процесс доставки сообщения получателю.
Получатели представляют собой приложения, которые обрабатывают получаемые сообщения, производят определенные манипуляции, могут отправить какой-то ответ. В процессе своей работы у получателя может произойти ошибка (в том числе в процессе обработки полученного сообщения), которая приведет к рестарту получателя. Также к подобным последствиям потенциально могут привести ошибки на сети.Эти ситуации вызывают вопрос о том, когда брокеру можно удалить сообщение из очереди.
Спецификации протокола AMQP определяют 2 возможных алгоритма доставки сообщения:
Первый вариант доставки сообщения называется режимом "автоматического подтверждения". Второй вариант можно назвать режимом "явного подтверждения". Особенностью второго варианта является то, что получатель может подтвердить доставку сообщения как сразу после получения сообщения, так и через какое-то время, после выполнения заложенной в нем бизнес-логики (например, после завершения транзакции по записи изменений в базу данных).
Если процесс получателя падает (падает коннекция к брокеру) либо истекает таймер ожидания подтверждения, брокер производит повторную доставку сообщения другому получателю. Если других получателей нет, то брокер будет ожидать появления получателя для последующей доставки ему сообщения.
В процессе обработки сообщения получателем может сложиться ситуация когда получатель не может обработать сообщение (некорректная информация, какая-то ошибка в логике, недоступность подсистем и т.п.). Получатель может просигнализировать брокеру об ошибке обработки сообщения путем отправки ему сообщения "reject". В процессе отправки "reject" получатель может сигнализировать брокеру о том, что сообщение должно быть сброшено либо предоставлено другому получателю (зависит от прикладной логики и характера ошибки).
Механизм управления потоком сообщений к получателю.
В AMQP введен очень полезный механизм ограничения количества сообщений, которые брокер отправляет одному получателю. Обычно такие механизмы называются "flow control" (механизм управления потоком сообщений).
Механизм управления потоком AMQP позволяет ограничивать поток информации, отправляемой брокером получателю по:
В системе CSS-17 этот механизм используется практически во всех кластерах и служит способом ограничения входящей нагрузки на процессы обрабатывающие сообщения.