Короткий ответ
Kafka подходит, когда нужен упорядоченный, воспроизводимый и долгоживущий журнал событий с возможностью перечитывания и масштабированием через партиционирование по ключу; RabbitMQ подходит для сценариев «задача-очередь» с гибкой маршрутизацией, где порядок важен в основном в пределах одной очереди.
Как это работает подробнее
Kafka гарантирует порядок только в пределах одной партиции, поэтому для сохранения порядка связанных событий нужно направлять их в одну партицию через ключ; RabbitMQ гарантирует порядок в пределах одной очереди при единственном consumer'е, а при нескольких конкурирующих consumer'ах порядок обработки не гарантирован.
Kafka даёт долгое хранение истории, replay и масштабируемость через партиции, но требует сложной операционной модели и явного мышления о партиционировании для гарантий порядка; RabbitMQ проще в небольших сценариях маршрутизации задач, но слабее подходит для большого объёма событий с долгим хранением и повторным чтением истории. Критерий выбора — нужен ли replay/аудит, объём и темп сообщений, критичность порядка между независимыми consumer'ами.
Пример кода
RabbitMQ: для похожей гарантии на сущность — направлять все сообщения по order_id
в одну очередь/consumer через consistent hash exchange,
что ограничивает горизонтальное масштабирование обработки конкретной сущности.Что использовать на практике
- Практика. При требовании строгого порядка обработки событий одной сущности выбор ключа партиционирования в Kafka — архитектурное решение с последствиями для масштабирования; в RabbitMQ для похожей гарантии нужна либо одна очередь на сущность, либо consistent routing.
Подводные камни
- Риск. Предполагать, что Kafka гарантирует глобальный порядок по всему топику; выбирать брокер по общей репутации без проверки, подходит ли его модель гарантий конкретному сценарию.