← Назад к вопросам

В чем разница между 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 приложения

Сравнительная таблица

ХарактеристикаKafkaRabbitMQArtemis
ТипEvent StreamMessage BrokerMessage Broker
ПротоколProprietaryAMQPJMS, AMQP, MQTT
DurabilityДисковое хранилищеMemory + ДисковоеДисковое
Message RetentionПо времени/размеруДо ACKДо обработки
ThroughputОчень высокий (млн msg/sec)Высокий (100k msg/sec)Высокий (100k msg/sec)
Latency10ms<1ms<1ms
ReplayabilityДа (offset'ы)НетНет
RoutingTopic/PartitionExchange/QueueQueue/Topic
Consumer GroupsВстроеноНетНет
HA/ClusteringВстроеноНужно настраиватьВстроено
Memory UsageEfficientHigherMedium
ComplexityHighMediumMedium

Выбор между ними

Используй 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 систем.

В чем разница между Apache Kafka, RabbitMQ и ActiveMQ Artemis? | PrepBro