Message #
Semua diskusi tentang producer dan consumer pada akhirnya bermuara pada satu hal:
Message.
Message adalah unit fundamental dalam RabbitMQ.
Namun message bukan hanya payload JSON yang dikirim dari satu service ke service lain.
Ia memiliki struktur, metadata, properti, dan perilaku tertentu yang menentukan:
- Bagaimana ia dirutekan
- Apakah ia disimpan ke disk
- Apakah ia bisa kadaluarsa
- Bagaimana ia diidentifikasi
- Bagaimana ia diproses ulang
Artikel ini membedah message dalam konteks RabbitMQ production system.
“Dalam sistem event-driven, message bukan sekadar data — ia adalah kontrak, fakta, dan sumber kebenaran yang bergerak.”
Apa Itu Message di RabbitMQ? #
Secara konseptual, message adalah paket data yang dikirim oleh producer ke exchange.
Namun secara teknis, message terdiri dari beberapa bagian:
- Payload (body)
- Properties
- Headers
RabbitMQ tidak peduli isi payload.
Ia hanya peduli bagaimana message dirutekan dan diperlakukan.
Struktur Message #
1. Struktur Konseptual Message #
+----------------------------------+
| Properties |
| delivery_mode |
| content_type |
| message_id |
| correlation_id |
| timestamp |
+----------------------------------+
| Headers |
| custom key-value |
+----------------------------------+
| Payload |
| JSON / Protobuf / Text / etc |
+----------------------------------+
Ketiga bagian ini memiliki fungsi berbeda.
Payload (Body) #
Payload adalah isi utama message.
Contoh:
- JSON event
- Binary protobuf
- Plain text
RabbitMQ tidak menginterpretasikan payload.
Ia hanya memindahkan byte stream.
Artinya:
- Validasi payload adalah tanggung jawab producer & consumer
- Schema management harus dilakukan di level aplikasi
Properties: Metadata Standar #
Properties adalah metadata bawaan yang didefinisikan oleh AMQP.
Beberapa properti penting:
delivery_mode #
- 1 → Non-persistent
- 2 → Persistent
Jika ingin durability, harus menggunakan delivery_mode = 2.
Namun queue juga harus durable.
message_id #
Identifier unik message.
Berguna untuk:
- Idempotency
- Deduplication
correlation_id #
Digunakan untuk:
- Request-response pattern
- RPC over RabbitMQ
timestamp #
Waktu message dibuat.
Berguna untuk:
- Audit
- Debugging
Headers: Metadata Kustom #
Headers adalah key-value tambahan yang dapat digunakan untuk:
- Routing (pada headers exchange)
- Versioning
- Context propagation
Contoh:
- event_version: v2
- source_service: order
Headers mempermudah evolusi sistem.
Message Lifecycle #
Message mengalami beberapa tahap.
2. Lifecycle Message #
Producer
|
| publish
v
Exchange
|
v
Queue
|
v
Consumer
|
v
Ack / Nack
Sepanjang lifecycle ini, message bisa:
- Disimpan di disk
- Direplikasi (quorum queue)
- Di-requeue
- Masuk DLQ
Memahami lifecycle penting untuk reliability.
Persistent vs Transient Message #
Transient Message #
- Tidak disinkronisasi ke disk
- Bisa hilang saat broker crash
- Lebih cepat
Persistent Message #
- Disimpan ke disk
- Lebih aman
- Lebih lambat
Tradeoff antara performa dan durability harus disadari.
Message Ordering #
Secara umum, queue bersifat FIFO.
Namun ordering bisa terganggu jika:
- Banyak consumer paralel
- Message di-requeue
- Menggunakan priority queue
Ordering bukan sesuatu yang otomatis terjamin secara global.
TTL (Time-To-Live) #
Message dapat memiliki TTL.
Jika melebihi TTL:
- Message expired
- Bisa masuk ke Dead Letter Exchange
TTL dapat diatur pada:
- Level queue
- Level message
TTL membantu mencegah message menumpuk selamanya.
Dead Lettering #
Jika message:
- Ditolak (nack requeue=false)
- Expired
- Melebihi max-length queue
Maka message bisa dialihkan ke Dead Letter Exchange.
Ini bagian dari error handling strategy.
Ukuran Message dan Dampaknya #
RabbitMQ tidak dirancang untuk message sangat besar.
Best practice:
- Simpan file besar di object storage
- Kirim hanya reference di message
Message besar menyebabkan:
- Memory pressure
- Disk I/O tinggi
- Throughput turun
Message sebagai Kontrak #
Dalam sistem event-driven, message adalah kontrak antar service.
Artinya:
- Perubahan struktur harus backward compatible
- Versioning perlu strategi
- Consumer lama harus tetap bisa membaca
Message design adalah bagian dari API design.
Ringkasan #
| Elemen | Fungsi |
|---|---|
| Payload | Data utama |
| Properties | Metadata standar AMQP |
| Headers | Metadata kustom |
| delivery_mode | Tentukan durability |
| message_id | Identifikasi unik |
| TTL | Batas waktu hidup |
Penutup #
Message adalah inti dari RabbitMQ.
Ia bukan sekadar data yang berpindah dari A ke B.
Ia memiliki:
- Struktur
- Lifecycle
- Properti
- Konsekuensi arsitektural
Memahami message berarti memahami bagaimana reliability, durability, dan behavior sistem terbentuk.
Karena dalam sistem asynchronous, semua hal penting selalu dimulai dari satu unit kecil yang disebut: message.