Как работает RabbitMQ?
архитектураасинхронностьочередипроектированиесообщения
Что проверяют
Понимаете ли вы схему обменников и очередей и знаете ли про подтверждения.
Как отвечать
Отправитель публикует сообщение не в очередь, а в обменник (exchange). Обменник по правилам привязки раскладывает сообщение по очередям. Потребитель читает из очереди и подтверждает обработку.
Типы обменников определяют маршрутизацию:
- direct: по точному совпадению ключа маршрутизации;
- topic: по шаблону с подстановками (
order.*.created); - fanout: во все привязанные очереди, ключ игнорируется;
- headers: по заголовкам.
Ключевые механизмы:
- подтверждения потребителя: сообщение удаляется из очереди не при доставке, а после
ack. Упал потребитель без подтверждения, сообщение вернётся в очередь и достанется другому. Отсюда доставка «хотя бы один раз» и требование идемпотентности; - prefetch: сколько сообщений отдавать потребителю до подтверждения. Без ограничения один потребитель заберёт всё, и остальные простаивают;
- подтверждения издателя: брокер подтверждает, что принял сообщение;
- устойчивость: очередь и сообщение должны быть помечены как долговечные, иначе они исчезнут при перезапуске брокера;
- очередь недоставленных сообщений: куда уходит то, что отклонили или что просрочилось. Без неё «плохое» сообщение крутится в бесконечном цикле.
Отличие от Kafka: здесь сообщение после подтверждения исчезает, перечитать историю нельзя, зато маршрутизация гибче.
Где спотыкаются
Считают, что публикуют прямо в очередь.
Не настраивают prefetch и получают перекос нагрузки.
Забывают про долговечность и теряют сообщения при перезапуске.
Не заводят очередь недоставленных и зацикливают обработку сбойного сообщения.