Topic Exchange¶
Topic Exchange - мощный механизм маршрутизации RabbitMQ. Данный тип exchange
отправляет сообщения в очереди в соответствии с паттерном,
указанном при их подключении к exchange
и routing_key
самого сообщения.
При этом, если очередь слушает несколько потребителей, сообщения все также будут распределяться между ними.
Пример¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
Объявление потребителей¶
Для начала мы объявили наш Topic exchange и несколько очередей, которые будут его слушать:
8 9 10 11 |
|
При этом в routing_key
наших очередей мы указываем паттерн ключей маршрутизации, которые будут обрабатываться этой очередью.
Затем мы подписали несколько потребителей с помощью объявленных очередей на созданный нами exchange
13 14 15 16 17 18 19 20 21 22 23 |
|
Note
Обратите внимание, что handler1
и handler2
подписаны на один exchange
с помощью одной и той же очереди:
в рамках одного сервиса это не имеет смысла, так как сообщения будут приходить в эти обработчики поочередно.
Здесь мы эмулируем работу несколько потребителей и балансировку нагрузки между ними.
Распределение сообщений¶
Теперь распределение сообщений между этими потребителями будет выглядеть следующим образом:
await broker.publish(routing_key="logs.info", exchange=exch) # handlers: 1
Сообщение 1
будет отправлено в handler1
, т.к. он слушает exchange
с помощью очереди с ключом маршрутизации *.info
await broker.publish(routing_key="logs.info", exchange=exch) # handlers: 2
Сообщение 2
будет отправлено в handler2
, т.к. он слушает exchange
с помощью той же очереди, но handler1
занят
await broker.publish(routing_key="logs.info", exchange=exch) # handlers: 1
Сообщение 3
снова будет отправлено в handler1
, т.к. он освободился на данный момент
await broker.publish(routing_key="logs.debug", exchange=exch) # handlers: 3
Сообщение 4
будет отправлено в handler3
, т.к. он единственный слушает exchange
с помощью очереди с ключом маршрутизации *.debug