Какие популярные брокеры очереди сообщений вы знаете
Что проверяют
Не список названий, а понимание, чем брокеры отличаются по модели и какой вы взяли бы под задачу. Go-разработчика следом почти всегда спрашивают, каким клиентом вы пользовались и как не потерять и не обработать дважды сообщение.
Как отвечать
Назовите три-четыре брокера и сразу их модель:
- Apache Kafka: распределённый лог. Сообщения не удаляются после чтения, хранятся по времени или объёму, порядок гарантирован внутри партиции, параллелизм задаётся числом партиций в consumer group. С версии 4.0 работает только в режиме KRaft, без ZooKeeper. Клиенты в Go:
twmb/franz-go,segmentio/kafka-go,IBM/sarama,confluent-kafka-go(через cgo и librdkafka); - RabbitMQ: очереди с маршрутизацией через exchange (
direct,topic,fanout,headers), подтвержденияack/nack, dead letter exchange, для надёжности quorum queues. Клиентrabbitmq/amqp091-go, старыйstreadway/amqpбольше не поддерживается; - NATS: сам написан на Go и очень лёгкий. Базовый режим это pub/sub без хранения, а JetStream добавляет персистентность, повторную доставку и подтверждения;
- Redis Streams: если Redis уже есть,
XADDи consumer groups сXACKзакрывают простые очереди задач.
Критерий выбора уложите в одну фразу: нужна история событий и повторное чтение, берите Kafka; нужна раздача задач воркерам с гибкой маршрутизацией, RabbitMQ; нужна лёгкая шина между сервисами, NATS.
В Go-коде стоит упомянуть: оффсет или ack фиксируется только после успешной обработки, отмена идёт через context.Context, а сервис корректно завершается по сигналу и дорабатывает сообщения, которые уже взял.
Где спотыкаются
Называют Redis Pub/Sub полноценной очередью. Если подписчик в этот момент не на связи, сообщение просто пропало.
Обещают exactly once в Kafka «из коробки». Транзакции Kafka действуют в пределах самой Kafka, а запись во внешнюю базу всё равно требует идемпотентной обработки.
Коммитят оффсет до обработки. В segmentio/kafka-go, например, ReadMessage в consumer group коммитит сам, а для ручного контроля нужны FetchMessage и CommitMessages.