2021-10-12 07:38:02
Сегодня будет конспект главы "Взаимодействие с помощью асинхронного обмена сообщениями".
В контексте асинхронного обмена мы будем говорить про брокеры сообщений.
Сообщения могут быть нескольких видов:
* Документ - только данные
* Команда - сообщение, эквивалентное RPC-запросу
* Событие - сообщение о том, что с отправителем что-то произошло
В рамках книги автор рассматривает использование команд и событий.
Канал сообщений - абстракция, представляющая транспортную шину, по которой передаются сообщения. Отправитель обращается к интерфейсу исходящего порта, который реализуется классом-адаптером отправителя, и передаёт сообщение в канал.
Для обработки сообщения вызывается класс-адаптер потребителя сообщений, который обращается к интерфейсу входящего порта, реализованного на стороне обработчика.
Каналов есть 2 вида:
* Точка - точка: доставка сообщений от одного издателя к одному потребителю
* Издатель - подписчик: доставка сообщений всем подключенным потребителям
Есть множество брокеров, на основе которых можно реализовать обмен сообщениями, и автор сразу выделяет наиболее популярные, и что не менее важно, с открытым исходным кодом:
* RabbitMQ
* ActiveMQ
* Apache Kafka
Проблемы при использовании брокеров.
Нарушение порядка следования сообщений: например, у нас есть много обработчиков, и есть 3 сообщения, которые должны быть выполнены в четком порядке: Order Created, Order Updated, Order Cancelled.
Распространённое решение, которое используют, например, Apache Kafka и AWS Kinesis - сегментированные каналы:
* Сегментированный канал - это два или более сегмента, где каждый сегмент - так же является каналом.
* Отправитель указывает в заголовке ключ сегмента, который обычно представляет собой произвользую строку или байты. Брокер использует этот ключ, чтобы привязать сообщение к определённому сегменту/разделу. Например, он может выбрать сегмент взятием остатка от целочисленного деления хеша сегментного ключа на количество сегментов.
От себя добавлю, что такой подход шардинга был реализован в видосах SovietReliable -
(да, тут чувак с потрясающим русским акцентом пилит распределённый брокер на Go, кто не смотрел - всем рекомендасьён)
* Брокер группирует экземпляры получателя и обращается с ними как с одним логическим получаетелем. В kafka применяется термин "группа получателей". Брокей назначает каждый сегмент отдельному получаетлю, при запуске и остановке получателей процедура повторяется.
343 viewsedited 04:38