ActiveMQ Artemis, RabbitMQ, dan Kafka: Perbandingan untuk Pemula

Jika Anda butuh antrean pesan klasik dengan dukungan JMS penuh di ekosistem Java, mulailah dengan ActiveMQ Artemis. Jika aplikasi Anda ditulis dalam beragam bahasa dan butuh routing pesan yang fleksibel, RabbitMQ biasanya paling nyaman. Jika yang Anda kelola adalah aliran event bervolume besar yang perlu disimpan lama dan bisa dibaca ulang, pilih Kafka. Ketiganya sama-sama disebut “message broker” dalam percakapan sehari-hari, tetapi model kerjanya berbeda, dan perbedaan itulah yang menentukan pilihan.

Dua model besar: antrean dan log

ActiveMQ Artemis dan RabbitMQ termasuk broker berbasis antrean. Pesan disimpan sampai consumer mengambil dan mengakuinya, lalu dihapus. Broker aktif mengatur siapa mendapat pesan apa, melacak pengiriman ulang, dan memindahkan pesan gagal ke dead letter queue.

Kafka bekerja sebagai log terdistribusi. Pesan (Kafka menyebutnya record) ditambahkan ke ujung log dan disimpan sesuai kebijakan retensi, misalnya beberapa hari atau sampai ukuran tertentu, terlepas dari sudah dibaca atau belum. Consumer sendiri yang mencatat sampai mana ia membaca, yang disebut offset. Karena itu satu data bisa dibaca banyak kelompok consumer, dan Anda bisa memutar ulang dari titik lama.

ActiveMQ Artemis

Artemis adalah broker generasi baru dari proyek Apache ActiveMQ, ditulis di Java. Ia mendukung JMS dan Jakarta Messaging secara penuh, plus protokol lain seperti AMQP, MQTT, STOMP, dan OpenWire (protokol ActiveMQ “Classic”). Konsep dasarnya adalah address sebagai tujuan pengiriman dan queue yang terikat ke address. Routing anycast berperilaku seperti queue JMS, sedangkan multicast seperti topic.

Kelebihannya: cocok dengan aplikasi Jakarta EE dan Spring yang sudah memakai API JMS, serta punya fitur matang seperti redelivery delay, dead letter address, message grouping, dan paging ke disk saat memori penuh. Beberapa server aplikasi, misalnya WildFly, menyertakan Artemis sebagai broker bawaan.

RabbitMQ

RabbitMQ ditulis dalam Erlang dengan protokol utama AMQP 0-9-1, dan mendukung protokol lain lewat plugin. Modelnya: producer mengirim ke exchange, lalu exchange meneruskan ke satu atau beberapa queue berdasarkan aturan binding. Jenis exchange yang umum: direct (cocok persis dengan routing key), topic (pola dengan wildcard), fanout (ke semua queue yang terikat), dan headers.

Kelebihannya: library klien tersedia untuk hampir semua bahasa, management UI-nya ramah pemula, dan routing lewat exchange membuat pola “satu event ke banyak layanan” mudah disusun. RabbitMQ juga punya quorum queue untuk replikasi yang lebih aman serta fitur stream untuk kebutuhan mirip log. Developer Java biasanya memakai klien Java resmi atau Spring AMQP; klien JMS untuk RabbitMQ tersedia, tetapi bukan jalur utamanya.

Apache Kafka

Kafka menyimpan data dalam topic yang dibagi menjadi beberapa partition. Urutan dijamin di dalam satu partition, dan record dengan kunci yang sama selalu masuk ke partition yang sama. Consumer bergabung dalam consumer group; setiap partition dibaca oleh satu anggota grup, sehingga paralelisme dibatasi jumlah partition. Grup lain bisa membaca topic yang sama secara terpisah dengan offset sendiri.

Kelebihannya: throughput tinggi, retensi panjang, kemampuan replay, dan ekosistem besar seperti Kafka Connect untuk menghubungkan database dan sistem lain serta Kafka Streams untuk pemrosesan aliran data. Versi baru Kafka bisa berjalan dalam mode KRaft tanpa ZooKeeper, sehingga operasionalnya lebih sederhana dibanding dulu. Namun Kafka tidak memakai API JMS, tidak punya dead letter queue bawaan, dan secara tradisional kurang pas untuk pola antrean tugas yang butuh pengakuan per pesan.

Tabel perbandingan

Aspek ActiveMQ Artemis RabbitMQ Kafka
Model Antrean (anycast dan multicast) Antrean dengan exchange Log terdistribusi
API atau protokol utama JMS/Jakarta Messaging, AMQP, MQTT, STOMP, OpenWire AMQP 0-9-1, plus plugin Protokol Kafka sendiri
Routing Address, queue, dan selector Exchange direct, topic, fanout, headers Topic dan partition berdasarkan kunci
Nasib pesan setelah dibaca Dihapus setelah diakui Dihapus setelah diakui (kecuali stream) Tetap ada sampai masa retensi habis
Urutan Per queue, bisa dengan message grouping Per queue Per partition
Replay data lama Tidak secara bawaan Lewat fitur stream Ya, dengan mengatur offset
Dead letter Bawaan (dead letter address) Bawaan (dead letter exchange) Dibangun di aplikasi
Paling cocok untuk Aplikasi Java/Jakarta EE, integrasi enterprise Layanan multibahasa, antrean tugas, routing fleksibel Event streaming, analitik, sinkronisasi data volume besar

Cara memilih: pertanyaan yang perlu dijawab

  1. Apakah kode Anda sudah memakai JMS? Jika ya, Artemis adalah jalur dengan perubahan paling sedikit.
  2. Apakah pesan perlu dibaca ulang di kemudian hari? Misalnya membangun ulang laporan dari event bulan lalu. Jika ya, Kafka unggul.
  3. Apakah setiap pesan adalah tugas yang harus diselesaikan satu pekerja, lengkap dengan retry dan dead letter? Artemis atau RabbitMQ lebih alami.
  4. Berapa bahasa pemrograman yang terlibat? Jika banyak, RabbitMQ atau Kafka dengan klien multibahasa lebih praktis. Artemis juga bisa diakses lewat AMQP atau STOMP.
  5. Siapa yang akan mengoperasikan? Klaster Kafka dengan banyak partition butuh pemahaman operasional lebih. Untuk tim kecil, layanan terkelola dari penyedia cloud bisa menjadi pertimbangan.

Contoh kasus

Toko online skala kecil sampai menengah yang butuh antrean untuk email, pembuatan label pengiriman, dan sinkronisasi stok akan terlayani dengan baik oleh RabbitMQ atau Artemis. Fitur retry dan dead letter bawaan sangat membantu; cara menanganinya saya jelaskan di artikel tentang dead letter queue dan redelivery. Ketika toko itu tumbuh dan tim data ingin setiap klik, perubahan stok, dan status pesanan mengalir ke gudang data untuk analisis, Kafka mulai masuk akal sebagai tulang punggung event, sementara antrean tugas tetap boleh di broker yang lama.

Memakai dua jenis broker sekaligus bukan hal aneh. Yang penting, setiap jenis pesan punya rumah yang jelas dan tim tahu alasannya.

Kesalahan pemula yang sering terlihat

  • Memilih Kafka karena populer, lalu menulis sendiri retry, dead letter, dan penjadwalan ulang yang di broker antrean sudah tersedia.
  • Memakai RabbitMQ sebagai penyimpanan jangka panjang dengan membiarkan jutaan pesan menumpuk di queue klasik. Queue yang sangat panjang membebani memori dan memperlambat broker.
  • Mengira semua broker menjamin urutan global. Urutan hanya berlaku per queue atau per partition, dan bisa rusak oleh pengiriman ulang atau consumer paralel.

Bila Anda baru mulai dan belum yakin kebutuhan ke depan, pilih broker yang paling mudah dijalankan dan dipantau oleh tim Anda saat ini. Untuk memahami fondasi API yang dipakai Artemis, baca juga pengertian JMS dan komponennya.

Hendra Kurniawan

Oleh Hendra Kurniawan

Pengembang backend Java yang lama menangani integrasi sistem dan message broker. Menulis catatan praktis tentang JMS, API, dan arsitektur aplikasi.