Ignore Backpressure #
Dalam sistem berbasis RabbitMQ, aliran pesan tidak selalu stabil.
Ada saat-saat ketika:
- Producer mengirim terlalu cepat
- Consumer terlalu lambat
- Disk mulai penuh
- Memory watermark tercapai
RabbitMQ memiliki mekanisme bawaan untuk menangani kondisi ini, yang disebut backpressure.
Namun salah satu anti-pattern paling berbahaya adalah:
Mengabaikan backpressure dan terus mendorong traffic seolah-olah sistem tidak memiliki batas.
Artikel ini membahas apa itu backpressure, bagaimana RabbitMQ mengimplementasikannya, dan mengapa mengabaikannya bisa berujung pada kegagalan sistemik.
“Ketika sistem melambat, itu bukan gangguan — itu peringatan.”
Apa Itu Backpressure? #
Backpressure adalah mekanisme kontrol aliran (flow control) yang memberi sinyal:
“Sistem sedang tidak mampu menerima beban tambahan saat ini.”
Dalam RabbitMQ, backpressure bisa terjadi ketika:
- Memory watermark terlampaui
- Disk hampir penuh
- Queue depth sangat besar
- Consumer terlalu lambat
Backpressure bukan error. Ia adalah mekanisme perlindungan.
Bagaimana RabbitMQ Menerapkan Backpressure? #
Beberapa mekanisme utama:
1️⃣ Memory Watermark #
Jika penggunaan memory melewati batas tertentu:
- Broker akan memblokir connection producer
- Publish akan ditahan sementara
2️⃣ Flow Control #
RabbitMQ dapat mengaktifkan flow control pada channel tertentu.
Producer akan mengalami:
- Publish latency meningkat
- Atau blocked connection
3️⃣ Disk Alarm #
Jika disk space hampir habis:
- Publish dihentikan
- Broker melindungi dirinya dari crash
Backpressure adalah tanda bahwa sistem mencoba bertahan.
Anti-Pattern: Mengabaikan Sinyal Ini #
Beberapa kesalahan umum:
- Producer tidak menangani blocked connection
- Tidak memonitor publish latency
- Tidak memonitor queue depth
- Tidak membatasi rate publish
- Tidak memiliki circuit breaker
Akibatnya:
- Producer terus mencoba publish
- Retry agresif
- Traffic melonjak
- Sistem semakin tertekan
Ini disebut self-amplifying failure.
Dampak Mengabaikan Backpressure #
1️⃣ Cascading Failure #
Jika RabbitMQ melambat:
- Producer timeout
- Producer retry
- Traffic meningkat
- RabbitMQ semakin overload
Masalah menyebar ke service lain.
2️⃣ Memory Exhaustion #
Jika backlog tidak dikontrol:
- Queue membesar
- Memory pressure meningkat
- Flow control aktif terus-menerus
3️⃣ Latency Tidak Stabil #
Tanpa rate limiting:
- Publish latency fluktuatif
- Consumer overload
- SLA tidak konsisten
4️⃣ Disk Bottleneck #
Jika menggunakan persistent atau quorum queue:
- Disk I/O meningkat drastis
- Replication latency meningkat
Backpressure adalah gejala. Mengabaikannya memperparah penyakit.
Mengapa Orang Mengabaikan Backpressure? #
Beberapa alasan umum:
- Tidak memahami mekanismenya
- Tidak memonitor metric yang tepat
- Mengira broker selalu mampu menerima beban
- Fokus hanya pada sisi producer
Padahal sistem messaging adalah ekosistem.
Strategi Menghadapi Backpressure #
1️⃣ Monitor Metric Kunci #
Pantau:
- Memory usage
- Disk usage
- Queue depth (ready & unacked)
- Publish rate
- Confirm latency
- Blocked connection count
Backpressure harus terlihat di dashboard.
2️⃣ Gunakan Publisher Confirm dengan Timeout #
Jika confirm lambat:
- Producer harus memperlambat publish
3️⃣ Implement Rate Limiting di Producer #
Jangan publish tanpa batas.
Gunakan:
- Token bucket
- Adaptive throttling
4️⃣ Gunakan Prefetch pada Consumer #
Prefetch membantu mengontrol aliran dari sisi consumer.
5️⃣ Gunakan Circuit Breaker #
Jika broker overload:
- Producer dapat menolak request sementara
- Sistem tetap stabil
Backpressure dalam Quorum Queue #
Pada quorum queue:
- Write latency meningkat saat cluster sibuk
- Confirm latency bisa menjadi indikator overload
Quorum queue lebih sensitif terhadap disk dan network.
Backpressure di sini harus dimonitor lebih ketat.
Perbandingan: Sistem yang Sadar vs Tidak Sadar Backpressure #
| Sistem | Perilaku |
|---|---|
| Mengabaikan backpressure | Retry agresif, cascading failure |
| Sadar backpressure | Adaptive throttling, stabil |
Backpressure adalah dialog antara broker dan producer. Jika producer tidak mendengar, sistem akan berteriak melalui kegagalan.
Ringkasan #
Ignoring backpressure adalah anti-pattern karena:
- Mengabaikan mekanisme perlindungan broker
- Memperburuk overload
- Menyebabkan cascading failure
- Membuat sistem tidak stabil
Backpressure bukan musuh. Ia adalah sinyal kesehatan.
Penutup #
Dalam sistem terdistribusi, tidak ada komponen yang tak terbatas.
RabbitMQ memiliki batas memory, disk, dan I/O.
Backpressure adalah cara broker mengatakan:
“Berhenti sebentar.”
Arsitektur yang matang mendengar sinyal ini dan menyesuaikan diri.
Arsitektur yang mengabaikannya akan memaksa sistem melewati batas — sampai akhirnya sistem berhenti dengan cara yang jauh lebih menyakitkan.
Karena dalam sistem messaging, stabilitas bukan tentang seberapa cepat kita mengirim.
Tetapi tentang seberapa baik kita tahu kapan harus melambat.