# Message Queue di Node.js: RabbitMQ vs BullMQ — Mana yang Harus Anda Pilih?

> Perbandingan praktis antara RabbitMQ dan BullMQ untuk sistem backend Node.js — mencakup arsitektur, kasus penggunaan, integrasi NestJS, dan kapan masing-masing adalah alat yang tepat.

URL: https://www.matthewswong.com/id/blog/message-queue-rabbitmq-bullmq/

- Author: Matthews Wong (https://www.matthewswong.com/id/about/)
- Published: 2025-06-10
- Updated: 2026-10-17
- Category: DevOps

BullMQ memiliki lebih dari 4,4 juta unduhan npm mingguan — angka yang mencerminkan betapa banyak developer Node.js menjangkau antrian berbasis Redis sebelum mempertimbangkan message broker mandiri seperti RabbitMQ. Keduanya adalah alat yang sangat baik, dan saya telah menggunakan keduanya dalam produksi. Untuk ERP, BullMQ adalah pilihan yang tepat untuk menangani notifikasi email dan pekerjaan pembuatan invoice.

## BullMQ: Antrian Berbasis Redis

BullMQ adalah pustaka antrian Node.js yang dibangun di atas Redis. Ini menyediakan antrian pekerjaan dengan prioritas, pekerjaan tertunda, pekerjaan berulang (gaya cron), kontrol konkurensi, pembatasan laju, dan dashboard (Bull Board) untuk pemantauan. Karena berjalan di Redis, yang kemungkinan sudah ada di stack Anda untuk caching, BullMQ tidak menambahkan ketergantungan infrastruktur baru.

### BullMQ dalam Praktik: Otomasi Email ERP

Dalam otomasi email ERP kami, event invoice.paid memicu pekerjaan BullMQ yang menghasilkan PDF tanda terima dan mengirim email konfirmasi. Kami menggunakan tiga fitur antrian: prioritas pekerjaan, pekerjaan tertunda (jadwalkan email tindak lanjut 7 hari setelah pembuatan invoice), dan percobaan ulang pekerjaan dengan backoff eksponensial. Bull Board memberi tim keuangan visibilitas ke dalam pekerjaan yang tertunda dan gagal tanpa memerlukan akses database.

> Dari membangun otomasi email di ERP kami: atur batas maxAttempts pada setiap pekerjaan — jangan biarkan di default percobaan ulang tanpa batas. Payload pekerjaan yang salah bentuk yang selalu melempar akan menumpuk percobaan ulang selamanya, mengonsumsi memori dan CPU Redis. Juga beri nama antrian Anda secara deskriptif ('erp:invoice:email', 'erp:report:generation') daripada 'default' — ketika Anda melihat kunci Redis enam bulan kemudian, Anda akan langsung memahami untuk apa setiap antrian itu.

## RabbitMQ: Message Broker Polyglot

RabbitMQ adalah message broker mandiri yang mengimplementasikan AMQP (Advanced Message Queuing Protocol). Ini mendukung exchange, antrian, binding, kunci routing, dan beberapa jenis exchange (direct, fanout, topic, headers). Tidak seperti BullMQ, RabbitMQ adalah bahasa-agnostik — produsen dan consumer dapat ditulis dalam bahasa apa pun. RabbitMQ adalah pilihan yang tepat ketika Anda membutuhkan message passing lintas bahasa atau ketika message broker Anda adalah komponen infrastruktur bersama yang digunakan oleh beberapa tim dan layanan.

### Jenis Exchange RabbitMQ dan Routing

Model routing RabbitMQ lebih fleksibel daripada antrian sederhana BullMQ. Exchange Direct merutekan pesan ke antrian berdasarkan kecocokan kunci routing yang tepat. Exchange Topic merutekan berdasarkan pola kunci routing ('order.#' cocok dengan 'order.created', 'order.paid', 'order.cancelled'). Exchange Fanout menyiarkan ke semua antrian yang terikat — berguna untuk fan-out event ketika beberapa layanan membutuhkan setiap event.

> **Pengiriman at-most-once RabbitMQ tanpa konfirmasi**

> Kesalahan umum dengan RabbitMQ adalah lupa mengakui pesan. Secara default, RabbitMQ menandai pesan sebagai terkirim segera setelah dikirim ke consumer — jika consumer crash sebelum memprosesnya, pesan hilang. Selalu gunakan acknowledgment manual (ack setelah pemrosesan berhasil) dan konfigurasi publisher confirms di sisi produsen. Juga, antrian RabbitMQ terbatas — jika consumer Anda lebih lambat dari produsen dan Anda belum menetapkan panjang antrian maksimum, Anda akan menghabiskan memori.

## Integrasi NestJS: Kedua Alat

NestJS mendukung keduanya secara langsung. Untuk BullMQ, gunakan @nestjs/bullmq — daftarkan antrian dengan BullModule.registerQueue(), dekorasi prosesor dengan @Processor dan @Process. Untuk RabbitMQ, gunakan @nestjs/microservices dengan transport AMQP, atau paket komunitas @golevelup/nestjs-rabbitmq yang menyediakan registrasi consumer berbasis dekorator yang lebih bersih.

## Matriks Keputusan: BullMQ vs RabbitMQ

Pilih BullMQ ketika: stack Anda hanya Node.js, Anda sudah memiliki Redis, Anda membutuhkan pekerjaan terjadwal/tertunda, Anda ingin UI dashboard disertakan, dan antrian Anda internal untuk satu kelompok layanan. Pilih RabbitMQ ketika: beberapa bahasa memproduksi atau mengonsumsi pesan, Anda membutuhkan topologi routing yang kompleks, infrastruktur messaging Anda dibagikan antar tim, atau Anda membutuhkan jaminan protokol tingkat AMQP.

## Kafka, RabbitMQ, atau BullMQ — Gambaran Lengkap

Memposisikan ketiganya: BullMQ adalah antrian pekerjaan — bagus untuk tugas latar belakang, pekerjaan terjadwal, dan pola retry-with-backoff dalam ekosistem Node.js. RabbitMQ adalah message broker — bagus untuk sistem event-driven polyglot dengan persyaratan routing. Kafka adalah platform event streaming — bagus untuk replay event throughput tinggi, event sourcing, dan sistem di mana beberapa layanan membutuhkan riwayat event yang tahan lama.

## Sumber & Bacaan Lebih Lanjut

- BullMQ Documentation — Getting Started
- RabbitMQ Documentation — AMQP Concepts
- npm — BullMQ Weekly Downloads

## Source links

- https://docs.bullmq.io/
- https://www.rabbitmq.com/tutorials/amqp-concepts
- https://www.npmjs.com/package/bullmq

## FAQ

### Apa perbedaan utama antara BullMQ dan RabbitMQ?

BullMQ adalah pustaka antrian pekerjaan Node.js yang dibangun di atas Redis, dirancang untuk tugas latar belakang dalam ekosistem Node.js. RabbitMQ adalah message broker mandiri yang mengimplementasikan AMQP, bersifat bahasa-agnostik, dan cocok untuk sistem polyglot lintas bahasa. Pertimbangan utamanya adalah kesederhanaan dan overhead infrastruktur rendah (BullMQ) versus fleksibilitas routing dan jaminan tingkat protokol (RabbitMQ).

### Kapan sebaiknya memilih BullMQ daripada RabbitMQ?

Pilih BullMQ ketika stack Anda hanya Node.js dan Anda sudah memiliki Redis di infrastruktur. BullMQ adalah pilihan pragmatis untuk aplikasi ERP atau SaaS yang dibangun sepenuhnya di NestJS, terutama ketika Anda membutuhkan pekerjaan terjadwal atau tertunda, percobaan ulang dengan backoff eksponensial, dan dashboard pemantauan bawaan seperti Bull Board.

### Apa kesalahan umum di produksi dengan RabbitMQ, dan bagaimana cara menghindarinya?

Kesalahan umum adalah lupa mengakui pesan secara manual. Secara default, RabbitMQ menandai pesan sebagai terkirim segera setelah dikirim ke consumer — jika consumer crash sebelum memprosesnya, pesan akan hilang. Selalu gunakan acknowledgment manual setelah pemrosesan berhasil dan konfigurasi publisher confirms di sisi produsen. Selain itu, atur x-max-length dan dead-letter exchange untuk mencegah kehabisan memori ketika consumer lebih lambat dari produsen.

### Bagaimana BullMQ menangani percobaan ulang, dan apa konfigurasi yang disarankan?

BullMQ mendukung percobaan ulang pekerjaan dengan backoff eksponensial, sehingga jika layanan hilir seperti penyedia email tidak tersedia sementara, sistem akan mencoba ulang dengan penundaan yang meningkat sebelum memindahkan pekerjaan ke dead-letter queue. Disarankan untuk selalu menetapkan batas maxAttempts pada setiap pekerjaan, bukan membiarkan default yang mencoba ulang tanpa batas, karena payload yang salah bentuk dapat menghabiskan memori dan CPU Redis.

### Bagaimana model routing RabbitMQ dibandingkan dengan antrian BullMQ?

RabbitMQ menawarkan beberapa jenis exchange — Direct untuk kecocokan kunci routing yang tepat, Topic untuk routing berbasis pola (misalnya 'order.#'), dan Fanout untuk menyiarkan ke semua antrian yang terikat — sehingga lebih cocok untuk topologi distribusi event yang kompleks. BullMQ menggunakan antrian bernama sederhana tanpa logika routing. Fleksibilitas ini membuat RabbitMQ menjadi pilihan yang tepat ketika beberapa layanan atau tim perlu mengonsumsi pesan dengan persyaratan routing yang berbeda.

---

- HTML version: https://www.matthewswong.com/id/blog/message-queue-rabbitmq-bullmq/
- English: https://www.matthewswong.com/en/blog/message-queue-rabbitmq-bullmq/
- Site index for agents: https://www.matthewswong.com/llms.txt
- Sitemap: https://www.matthewswong.com/sitemap.xml
- API description (OpenAPI): https://www.matthewswong.com/openapi.json
