← Назад к вопросам
В чем разница между Apache Kafka, RabbitMQ и ActiveMQ Artemis?
3.0 Senior🔥 171 комментариев
#Брокеры сообщений
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Apache Kafka vs RabbitMQ vs ActiveMQ Artemis
Это три популярных message broker'а, но они решают разные задачи. Давайте разберёмся в различиях.
1. Apache Kafka
Назначение: Streaming платформа для обработки больших потоков данных в реальном времени.
Архитектура:
- Pub/Sub с topic'ами и partition'ами
- Сообщения хранятся на диске
- Потребители читают с offset'ов
- Высокий throughput (миллионы сообщений/сек)
// Producer в Kafka
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
KafkaProducer<String, String> producer = new KafkaProducer<>(props);
producer.send(new ProducerRecord<>("user-events", "key", "value"));
producer.close();
// Consumer в Kafka
props.put("group.id", "my-group");
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Arrays.asList("user-events"));
for (ConsumerRecord<String, String> record : consumer.poll(Duration.ofMillis(100))) {
System.out.println("Key: " + record.key() + ", Value: " + record.value());
}
Особенности:
- Durability — сообщения хранятся на диске
- Replayability — можно переочитать сообщения с offset'а
- Partitioning — масштабируемость через partition'ы
- Consumer Groups — множество потребителей могут читать один topic
- Retention Policy — контроль сколько хранить сообщения
Когда использовать:
- Обработка больших потоков данных
- Event sourcing
- Логирование в масштабе
- Real-time analytics
2. RabbitMQ
Назначение: Надёжная доставка сообщений между приложениями.
Архитектура:
- AMQP протокол (Advanced Message Queuing Protocol)
- Exchange'и маршрутизируют сообщения в queue'ы
- Сообщение удаляется после обработки
- Гарантия доставки (ACK/NACK)
// Producer в RabbitMQ (используя Spring)
@Configuration
public class RabbitConfig {
@Bean
public Queue myQueue() {
return new Queue("my.queue", true);
}
@Bean
public DirectExchange exchange() {
return new DirectExchange("my.exchange", true, false);
}
@Bean
public Binding binding(Queue queue, DirectExchange exchange) {
return BindingBuilder.bind(queue).to(exchange).with("my.routing.key");
}
}
@Component
public class MessageProducer {
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendMessage(String message) {
rabbitTemplate.convertAndSend("my.exchange", "my.routing.key", message);
}
}
// Consumer в RabbitMQ
@Component
public class MessageConsumer {
@RabbitListener(queues = "my.queue")
public void receiveMessage(String message) {
System.out.println("Получено: " + message);
}
}
Особенности:
- Гарантия доставки — ACK/NACK, retry механизм
- Маршрутизация — flexible routing (direct, topic, fanout, headers)
- Priority Queue — приоритизация сообщений
- Dead Letter Queue — обработка неудачных сообщений
- Message TTL — время жизни сообщения
Когда использовать:
- Надёжная доставка сообщений
- Task queue'ы
- RPC (Request/Reply)
- Complex routing
- Legacy systems с AMQP
3. ActiveMQ Artemis
Назначение: Универсальный message broker (переемник ActiveMQ).
Архитектура:
- JMS API
- Point-to-Point (queue) и Pub/Sub (topic)
- Встроенная высокая доступность
- Хранение на диске с fast recovery
// Producer в ActiveMQ Artemis (JMS)
@Bean
public ConnectionFactory connectionFactory() {
return new ActiveMQConnectionFactory("tcp://localhost:61616");
}
@Component
public class MessageProducer {
@Autowired
private JmsTemplate jmsTemplate;
public void sendMessage(String message) {
jmsTemplate.convertAndSend("myQueue", message);
}
}
// Consumer в ActiveMQ Artemis
@Component
public class MessageConsumer {
@JmsListener(destination = "myQueue")
public void receiveMessage(String message) {
System.out.println("Получено: " + message);
}
}
Особенности:
- JMS compliant — стандартный JMS API
- High availability — встроённая репликация
- Multiple protocols — OpenWire, AMQP, STOMP, MQTT
- Fast recovery — быстрое восстановление после сбоя
- Cluster mode — встроённая кластеризация
Когда использовать:
- Enterprise-grade messaging
- Нужна JMS API
- High availability требуется
- Mixed protocols
- Legacy JMS приложения
Сравнительная таблица
| Характеристика | Kafka | RabbitMQ | Artemis |
|---|---|---|---|
| Тип | Event Stream | Message Broker | Message Broker |
| Протокол | Proprietary | AMQP | JMS, AMQP, MQTT |
| Durability | Дисковое хранилище | Memory + Дисковое | Дисковое |
| Message Retention | По времени/размеру | До ACK | До обработки |
| Throughput | Очень высокий (млн msg/sec) | Высокий (100k msg/sec) | Высокий (100k msg/sec) |
| Latency | 10ms | <1ms | <1ms |
| Replayability | Да (offset'ы) | Нет | Нет |
| Routing | Topic/Partition | Exchange/Queue | Queue/Topic |
| Consumer Groups | Встроено | Нет | Нет |
| HA/Clustering | Встроено | Нужно настраивать | Встроено |
| Memory Usage | Efficient | Higher | Medium |
| Complexity | High | Medium | Medium |
Выбор между ними
Используй Kafka если:
- Нужна обработка потоков данных
- Нужна replayability
- Очень высокий throughput
- Event sourcing
- Data pipeline'ы
Используй RabbitMQ если:
- Нужна надёжная доставка
- Complex routing логика
- Task queue'ы
- Есть legacy AMQP system'ы
- Нужна low latency
Используй ActiveMQ Artemis если:
- Нужна JMS API
- Enterprise требования
- High availability critical
- Нужна поддержка multiple protocols
- Legacy ActiveMQ миграция
Пример архитектуры
Е-commerce система:
├── Order Service → Kafka (event stream)
│ ├── order-created topic
│ ├── order-processed topic
│ └── order-shipped topic
├── Inventory Service ← читает из Kafka
├── Payment Service → RabbitMQ (надёжная доставка платежей)
├── Notification Service ← слушает RabbitMQ
└── Analytics ← читает из Kafka для отчётов
Выбор message broker'а зависит от требований. Kafka лучше для потоков данных, RabbitMQ для надёжной доставки, Artemis для enterprise систем.