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:

  1. Payload (body)
  2. Properties
  3. 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 #

ElemenFungsi
PayloadData utama
PropertiesMetadata standar AMQP
HeadersMetadata kustom
delivery_modeTentukan durability
message_idIdentifikasi unik
TTLBatas 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.

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact