Ответ
Kafka и RabbitMQ — это популярные брокеры сообщений, но с фундаментально разными архитектурами и паттернами использования.
Apache Kafka
- Модель: Распределённый лог-ориентированный (log-centric) брокер.
- Назначение: Обработка высокоскоростных потоков данных (streaming), событийный механизм, сбор логов.
- Гарантии доставки: "At least once" по умолчанию, настраивается до "exactly once".
- Хранение: Сообщения хранятся долго (дни, недели) на диске в упорядоченных, неизменяемых логах (топиках с партициями).
- Потребление: Потребители управляют своим смещением (offset) и могут перечитывать старые сообщения.
Пример Producer на Java:
Properties props = new Properties();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "kafka-broker:9092");
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
props.put(ProducerConfig.ACKS_CONFIG, "all"); // Высокая надёжность
KafkaProducer<String, String> producer = new KafkaProducer<>(props);
ProducerRecord<String, String> record = new ProducerRecord<>("orders", "order-123", "{...}");
producer.send(record); // Асинхронная отправка
producer.close();
RabbitMQ
- Модель: Умный брокер / очереди сообщений на основе AMQP.
- Назначение: Точечная доставка задач, RPC, сложная маршрутизация, фоновые задания.
- Гарантии доставки: Подтверждения (ACK), транзакции, "exactly once" с помощью подтверждений издателя (publisher confirms).
- Хранение: Сообщения хранятся в памяти или на диске до момента обработки потребителем, затем обычно удаляются.
- Потребление: Сообщение удаляется из очереди после подтверждения (ACK) потребителем.
Пример отправки в RabbitMQ (Spring AMQP):
@Autowired
private AmqpTemplate amqpTemplate;
public void sendOrder(Order order) {
// Отправка в exchange "orders" с routing key "new"
amqpTemplate.convertAndSend("orders", "new", order, message -> {
message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);
return message;
});
}
Сравнительная таблица
| Параметр | Apache Kafka | RabbitMQ |
|---|---|---|
| Архитектура | Распределённый лог (партиции, реплики) | Централизованный брокер (очереди, exchange) |
| Протокол | Собственный (над TCP), есть клиенты для многих языков | AMQP 0.9.1 (стандарт), также MQTT, STOMP |
| Маршрутизация | По партициям топика (ключ сообщения) | Гибкая (direct, topic, fanout, headers exchange) |
| Скорость | Очень высокая (миллионы сообщений/сек) за счёт пакетной обработки и логов | Высокая, но обычно ниже Kafka для потоков |
| Задержка | Низкая (миллисекунды) | Очень низкая (микросекунды) для одиночных сообщений |
| Масштабирование | Горизонтальное (добавление брокеров и партиций) | Вертикальное и кластеризация (очереди на узлах) |
| Идеальный сценарий | Потоковая обработка, аналитика в реальном времени, событийные шины | Фоновые задачи, надежная доставка, сложная маршрутизация |
Вывод: Выбирайте Kafka для потоков данных и событийной архитектуры. Выбирайте RabbitMQ для фоновых заданий, распределения нагрузки и сложных правил маршрутизации.