awesome-everything EN
↑ Обратно к восхождению

Очереди, потоки, события

RabbitMQ exchanges: чтение конфигов и маршрутизации

Суть Читай реальные конфиги binding'ов RabbitMQ и сниппеты маршрутизации, предскажи, какие queue получат копию, и выбери фикс, который senior сделает первым.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на senior-высоте — в орбите
◷ 14 min

Баги маршрутизации читаются в таблице binding’ов и в вызове publish, а не в стектрейсе — его обычно нет. Читай каждый конфиг и сниппет, затем выбери поведение или фикс, который senior сделает первым.

Цель

Отработай цикл, который ты запускаешь в каждом инциденте маршрутизации: прочитай тип exchange и binding’и, предскажи, какие queue получат копию, и потянись к верному фиксу прежде, чем гадать на продюсера.

Сниппет 1 — topic-binding’и

exchange: events  (type: topic)

bindings:
  Q_audit   <- "order.#"
  Q_eu      <- "order.*.eu"
  Q_created <- "order.created.*"

publish routing key: "order.created.eu"
Викторина

С routing key order.created.eu, опубликованным в topic exchange events, какие queue получат копию?

Сниппет 2 — конфиг prefetch

channel.basic_qos(prefetch_count=1000)   # один канал, много consumer'ов
channel.basic_consume(queue="jobs", on_message_callback=handle)
# handle() делает медленную CPU-bound работу, ~200ms на сообщение
Викторина

Несколько worker'ов потребляют jobs с этим конфигом, работа распределена неравномерно, а память брокера растёт. В чём дефект и фикс?

Сниппет 3 — конфиг dead-letter

declare queue "work" with arguments:
  x-dead-letter-exchange: "dlx"
  x-message-ttl: 30000          # 30s

exchange "dlx" (type: fanout)  ->  queue "work.dead"

consumer on "work": on failure -> channel.basic_nack(requeue=True)
Викторина

Poison message бесконечно зацикливается на queue work и никогда не доходит до work.dead, несмотря на конфиг dead-letter. Почему?

Сниппет 4 — default exchange

# exchange не объявлен; публикуем с пустым именем exchange
channel.basic_publish(exchange="", routing_key="reports", body=payload)
# queue с именем "reports" существует, но ТАКЖЕ привязана к topic exchange "events"
Викторина

Куда уйдёт это сообщение при пустом имени exchange и routing key reports?

Итог

Маршрутизация читается в таблице binding’ов, а не в стектрейсе: topic-паттерны матчатся независимо, и каждое совпадение даёт копию (* — ровно одно слово, # — ноль или более); слишком высокий prefetch резервирует большой неподтверждённый батч на одном consumer’е и голодает остальных; dead-lettering срабатывает только на reject/expire, поэтому nack-with-requeue зацикливает poison message навсегда; а пустая строка-exchange — это default direct exchange, где routing key и есть имя queue. Сначала прочитай тип и binding’и, предскажи копии, потом чини.

Продолжить восхождение ↑RabbitMQ exchanges: построй маршрутизирующую ткань событий заказов
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources1
expand
  1. 01

Trademarks belong to their respective owners. Editorial reference only.