Empat Tipe, Empat Pertanyaan
| Tipe | Aturan pencocokan | Pertanyaan yang dijawab |
|---|---|---|
| direct | routing key sama persis | "Kirim ke satu tujuan tertentu" |
| fanout | abaikan routing key, kirim ke semua | "Semua orang perlu tahu" |
| topic | pola dengan * dan # | "Kirim ke yang berminat pada kategori ini" |
| headers | cocokkan header, bukan routing key | "Kriterianya lebih dari satu dimensi" |
Direct — Paling Sederhana
exchange "tugas" (direct)
routing_key="prioritas.tinggi" ──> queue tugas.mendesak
routing_key="prioritas.normal" ──> queue tugas.biasa
Beberapa queue boleh memakai binding key yang sama:
queue A binding "laporan" ┐
queue B binding "laporan" ┴──> keduanya menerima salinanBila beberapa konsumer menempel pada satu queue, pesan dibagi bergiliran di antara mereka — inilah pola work queue. Bila beberapa queue punya binding yang sama, masing-masing menerima salinan.
Satu queue, 3 konsumer → beban DIBAGI (1 pesan diproses 1 kali)
Tiga queue, 1 konsumer → pesan DISALIN (1 pesan diproses 3 kali)Ingin menambah kapasitas? Tambah konsumer pada queue yang sama. Ingin menambah fitur yang bereaksi pada peristiwa yang sama? Tambah queue dengan binding baru.
Fanout — Siaran
Routing key diabaikan sepenuhnya. Setiap queue yang terikat menerima salinan. Cocok untuk pembatalan cache, notifikasi konfigurasi berubah, atau peristiwa yang semua layanan perlu tahu.
Topic — Yang Paling Sering Dipakai di Produksi
Routing key dipisah titik: "pesanan.jakarta.dibuat"
* cocok dengan TEPAT SATU kata
# cocok dengan NOL ATAU LEBIH kata
Pola Cocok dengan
─────────────────────────── ──────────────────────────────────────────
pesanan.*.dibuat pesanan.jakarta.dibuat ✓
pesanan.dibuat ✗ (kurang 1 kata)
pesanan.jakarta.utara.dibuat ✗ (lebih 1 kata)
pesanan.# pesanan.dibuat ✓
pesanan.jakarta.utara.dibuat ✓
pesanan ✓ (# boleh nol kata)
#.dibuat pesanan.dibuat ✓
pembayaran.jakarta.dibuat ✓
# SEMUA pesan ✓Urutan segmen menentukan pola apa yang mungkin ditulis nanti. Susun dari kategori terluas ke terkecil.
✅ <domain>.<wilayah>.<peristiwa>
pesanan.jakarta.dibuat
→ bisa: pesanan.# (semua tentang pesanan)
→ bisa: pesanan.jakarta.# (semua di Jakarta)
→ bisa: *.jakarta.* (semua domain di Jakarta)
❌ dibuat.pesanan.jakarta
→ tidak ada pola wajar untuk "semua tentang pesanan"Batas teknis: maksimal 255 byte untuk routing key. Batas praktis: lebih dari empat segmen biasanya menandakan Anda memaksakan terlalu banyak informasi ke dalam satu string — pindahkan ke header.
Headers — Jarang Dipakai, Kadang Tepat
binding arguments:
x-match = all → semua header harus cocok (DAN)
x-match = any → salah satu cukup (ATAU)
binding: { "x-match": "all", "format": "pdf", "prioritas": "tinggi" }
pesan : headers { "format": "pdf", "prioritas": "tinggi", "penulis": "ani" }
→ cocok (header tambahan diabaikan)Headers exchange lebih lambat daripada topic karena tidak bisa memakai indeks trie. Pakai hanya bila kriterianya benar-benar multi-dimensi dan tidak masuk akal digabung ke dalam satu routing key.
Exchange Bawaan
| Nama | Tipe | Kegunaan |
|---|---|---|
"" (kosong) | direct | Routing key = nama queue. Praktis, tetapi tidak bisa diperluas |
amq.direct | direct | Untuk percobaan cepat |
amq.fanout | fanout | Untuk percobaan cepat |
amq.topic | topic | Untuk percobaan cepat |
amq.rabbitmq.trace | topic | Firehose tracer untuk debugging |
Untuk produksi, buat exchange bernama sendiri. Exchange amq.* tidak bisa dihapus dan mencampur beberapa sistem di dalamnya membuat topologi sulit dilacak.
Alternate Exchange — Jaring Pengaman
rabbitmqadmin declare exchange name=pesanan.tak-terkirim type=fanout durable=true
rabbitmqadmin declare queue name=pesanan.tak-terkirim.q durable=true
rabbitmqadmin declare binding source=pesanan.tak-terkirim destination=pesanan.tak-terkirim.q
rabbitmqadmin declare exchange name=pesanan type=topic durable=true \
arguments='{"alternate-exchange":"pesanan.tak-terkirim"}'Sekarang pesan yang tidak cocok dengan binding mana pun tidak lagi lenyap — ia jatuh ke queue khusus. Pasang alert bila queue itu tidak kosong, dan Anda akan tahu dalam hitungan menit ketika ada routing key baru yang belum ada bindingnya.
Exchange-to-Exchange Binding
Exchange boleh terikat ke exchange lain. Ini memungkinkan lapisan routing yang rapi: satu exchange penerima utama meneruskan ke beberapa exchange domain, tanpa producer perlu tahu strukturnya.
peristiwa (topic)
├── binding "pesanan.#" ──> pesanan (topic) ──> queue-queue pesanan
├── binding "pembayaran.#" ──> pembayaran (topic) ──> queue-queue pembayaran
└── binding "#" ──> audit (fanout) ──> queue audit semua