RabbitMQ nám slouží skvěle pro task queues. Ale pro event-driven architekturu — kde chcete, aby událost dostali všichni zájemci a mohli ji replay-ovat — potřebujete jiný model. Apache Kafka je distribuovaný commit log, ne message queue.
Kafka vs. RabbitMQ¶
RabbitMQ: zpráva je doručena jednomu konzumentu a smazána. Kafka: zpráva je zapsána do logu a uložena (dny, týdny). Každý konzument čte z logu nezávisle. Replay je možný.
Koncepty¶
Topics: Logické kanály (order-events, user-events). Partitions: Horizontální škálování — topic rozdělen na partitions. Consumer groups: Konzumenti ve skupině sdílejí partitions. Offsets: Každý konzument si pamatuje, kde v logu skončil.
// Producer
Properties props = new Properties();
props.put("bootstrap.servers", "kafka:9092");
props.put("key.serializer", StringSerializer.class);
props.put("value.serializer", StringSerializer.class);
Producer<String, String> producer = new KafkaProducer<>(props);
producer.send(new ProducerRecord<>("order-events", orderId, orderJson));
Use cases¶
- Event sourcing — ukládání událostí místo stavu
- Data pipeline — proudění dat mezi systémy
- Log aggregation — centrální sběr logů
- Stream processing — real-time transformace dat
Provozní zkušenosti¶
Kafka vyžaduje ZooKeeper pro koordinaci. Cluster se 3 brokery a replication factor 3 je minimum pro produkci. Operačně náročnější než RabbitMQ, ale propustnost je řádově vyšší.
Kafka pro events, RabbitMQ pro tasks¶
Kafka není náhrada RabbitMQ — je to jiný nástroj pro jiný problém. Event-driven architektura s Kafkou, task queues s RabbitMQ. Oba v našem stacku.