← Данные
12 мин · средне · Урок 5 из 5

Очереди сообщений: зачем и как

Зачем развязывать сервисы через очередь, чем producer отличается от consumer и в чём разница RabbitMQ и Kafka.

Проблема прямого вызова

Сервис заказов после оформления должен отправить письмо, начислить бонусы и обновить аналитику. Если он вызывает эти три сервиса напрямую и ждёт ответа, он становится медленным и хрупким: упал почтовый сервис, и заказ не оформляется, хотя к почте он отношения не имеет. Очередь сообщений развязывает это.

Producer, очередь, consumer

Идея простая. Сервис не вызывает других напрямую, а кладёт сообщение в очередь и идёт дальше. Другие сервисы забирают сообщения из очереди и обрабатывают в своём темпе.

«заказ создан» забирают producerorders очередь consumers email bonuses analytics
Producer освобождается сразу, а consumer разбирает очередь в своём темпе.

Сервис заказов теперь не ждёт почту и не падает из-за неё: он положил сообщение и свободен.

Что это даёт

At-least-once и идемпотентность

Брокеры обычно гарантируют доставку at-least-once: сообщение дойдёт хотя бы раз, но при сбоях может прийти повторно. Поэтому consumer должен быть идемпотентным из урока про идемпотентность: повторная обработка одного сообщения не должна начислять бонусы дважды. Это ключевое требование к обработчикам очередей.

RabbitMQ и Kafka

Два самых частых брокера решают слегка разные задачи:

Грубо: нужна очередь задач берут RabbitMQ, нужен поток событий для многих потребителей берут Kafka.

Что важно запомнить

Очередь развязывает сервисы: producer кладёт сообщение и не ждёт, consumer обрабатывает в своём темпе. Это убирает каскадные падения, сглаживает пики и позволяет масштабировать обработку, добавляя consumer-ов.

Доставка at-least-once означает возможный повтор, поэтому consumer должен быть идемпотентным. RabbitMQ — очередь задач (сделать один раз), Kafka — лог событий (многие читатели независимо).

Этим закрывается трек про данные: база, миграции, пулы, кеш и очереди.

Прошли материал до конца? Отметьте урок пройденным.