Headers #
Jika direct exchange menggunakan exact match, dan topic exchange menggunakan pola string, maka headers exchange mengambil pendekatan berbeda.
Headers exchange melakukan routing berdasarkan metadata header, bukan routing key.
Tipe ini lebih jarang digunakan dibanding direct atau topic, tetapi dalam beberapa skenario tertentu ia sangat powerful.
Artikel ini membahas headers exchange secara mendalam dalam konteks desain RabbitMQ production.
“Kadang keputusan routing tidak cukup ditentukan oleh satu string — tetapi oleh kombinasi atribut yang membentuk konteks pesan.”
Apa Itu Headers Exchange? #
Headers exchange adalah tipe exchange yang:
- Mengabaikan routing key
- Mengevaluasi header key-value pada message
- Mencocokkan header tersebut dengan aturan binding
Routing dilakukan berdasarkan isi headers.
Bukan berdasarkan string routing key.
Cara Kerja Headers Exchange #
Saat melakukan binding, queue dapat mendefinisikan:
- Header yang harus cocok
- Mode pencocokan (all atau any)
1. Diagram Header-Based Routing #
Producer
headers:
event_type = "order"
priority = "high"
|
v
Headers Exchange
|
binding rule:
x-match = all
event_type = "order"
priority = "high"
|
v
Queue A
Jika semua header cocok (mode all), message dikirim ke queue.
Mode Pencocokan: all vs any #
Saat binding, kita dapat menentukan argumen:
x-match = all atau x-match = any
x-match = all #
Semua header yang didefinisikan pada binding harus cocok.
x-match = any #
Minimal satu header cocok sudah cukup.
Mode ini memberikan fleksibilitas dalam routing kompleks.
Kapan Headers Exchange Digunakan? #
Headers exchange cocok untuk:
Multi-Attribute Filtering #
Contoh:
- region = “asia”
- customer_type = “premium”
- priority = “high”
Routing berdasarkan kombinasi atribut.
Ketika Routing Key Tidak Cukup #
Jika struktur routing key terlalu kompleks atau tidak representatif.
Sistem dengan Metadata Kaya #
Jika message memiliki banyak atribut yang memengaruhi pemrosesan.
Perbandingan dengan Topic Exchange #
| Aspek | Topic | Headers |
|---|---|---|
| Routing berdasarkan | String pattern | Header key-value |
| Wildcard | Ya | Tidak |
| Fleksibilitas | Tinggi | Tinggi |
| Kompleksitas | Moderat | Lebih tinggi |
| Performa | Lebih ringan | Lebih berat |
Headers exchange umumnya memiliki overhead lebih besar karena perlu mengevaluasi map header.
Kelebihan Headers Exchange #
Ekspresif untuk Routing Kompleks #
Tidak terbatas pada pola string.
Tidak Bergantung pada Format Routing Key #
Struktur routing bisa lebih bebas.
Keterbatasan Headers Exchange #
Overhead Evaluasi Lebih Tinggi #
Matching beberapa header lebih mahal dibanding string match sederhana.
Kurang Umum Digunakan #
Sebagian besar sistem event-driven modern cukup menggunakan topic exchange.
Potensi Kompleksitas Desain #
Jika terlalu banyak kombinasi header, routing menjadi sulit dipahami.
Headers Exchange dalam Production #
Dalam praktik production:
- Jarang digunakan untuk event domain umum
- Lebih cocok untuk sistem yang membutuhkan filtering granular berbasis atribut
Sebagian besar arsitektur event-driven skala besar tetap menggunakan topic exchange karena lebih sederhana dan cukup fleksibel.
Best Practice #
Gunakan Jika Benar-Benar Dibutuhkan #
Jangan gunakan headers exchange hanya karena terlihat fleksibel.
Dokumentasikan Header Contract #
Header adalah bagian dari kontrak antar service.
Perubahan harus backward compatible.
Pertimbangkan Performa #
Jika throughput sangat tinggi, topic exchange mungkin lebih efisien.
Ringkasan #
| Konsep | Penjelasan |
|---|---|
| Headers exchange | Routing berbasis metadata header |
| x-match=all | Semua header harus cocok |
| x-match=any | Minimal satu header cocok |
| Cocok untuk | Filtering kompleks berbasis atribut |
Penutup #
Headers exchange adalah alat routing paling ekspresif dalam RabbitMQ.
Namun fleksibilitas selalu datang dengan harga:
- Kompleksitas
- Overhead evaluasi
- Potensi kebingungan desain
Dalam banyak sistem modern, topic exchange sudah cukup.
Headers exchange sebaiknya digunakan ketika routing berbasis string tidak lagi mampu merepresentasikan kebutuhan domain.
Karena dalam arsitektur messaging yang matang, setiap mekanisme routing harus dipilih bukan karena fleksibel — tetapi karena tepat guna.