моих задач. Точнее на сколько он будет лучше текущей реализации на Redis Pub/Sub.
Задача в том, чтобы сделать совокупность узлов (сервисов), обменивающихся между собой данными (json). Требования к узлу:
1. Каждый узел имеет свой тип. В системе может быть несколько узлов одного типа.
2. Каждый тип узла имеет набор действий, которые можно инициировать адресованным сообщением "тип_узла.действие", прикрепив к такому сообщению данные в json.
3. Сообщения бывают двух видов:
3.1 Первый вид: отправленное одним узлом сообщение адресуется не конкретному узлу, а совокупности узлов по типу. То есть когда мы отправили сообщение, оно распределяется по round robin в рамках узлов одного типа и соответственно действие выполняется только на одном из узлов.
3.2 Второй вид: широковещательное сообщение, которое будет отправлено всем узлам всех видов.
Сообщения первого типа после выполнения действия должны отправить ответ конкретному узлу, который инициировал сообщение, запустившее действие. Сообщения второго вида не отправляют ответов.
Подводя итог, мне требуется следующее:
1. Отправлять сообщение, распределяющееся по группе узлов (round robin).
2. Отправлять сообщение конкретному узлу (ответ на сообщение).
3. Отправлять широковещательное сообщение группе однотипных узлов.
4. Получать все входящие сообщения.
Бегло изучив теорию, пока у меня в голове складывается такая конструкция: каждому узлу надо присвоить тип (для отправки распределенных сообщений) и уникальное имя (для персональных сообщений-ответов конкретному узлу). Соответственно в рамках Rabbit я должен создать две очереди тип_узла и уникальное_имя_узла. Ну и для широковещательных сообщений я должен буду сделать fanout exchange с биндом на очередь тип_узла.
Дифференциацию сообщений по конкретным действиям в рамках одного типа узла я бы полностью вынес в код обработки очередей и не завязывал бы на конкретный брокер (будь то Rabbit, Redis или что-то другое).
А теперь к вопросам. Правильно ли я все понимаю? Не будет ли избыточным заводить две очереди на один узел? Может быть есть более элегантные способы сделать желаемое?
в целом на концепцию роутинга и биндингов кладется то что вы хотите, но в привчном понимании «широковещательных» рассылок тут нет, нужно просто добавить биндинг с роутинг кеем типа all
кроль умеет round robin?
можно приколхозить, можно просто подписать на одну очередь все консьюмеры - сами разберутся
Обсуждают сегодня