UNDER PRESSURE

Level 3 · Sistem yang Saling Bergantung

Sesi 27: Menampung Beban Tanpa Menunggu: Message Queue, Backpressure, & DLQ

Bagaimana jika pengguna yang baru saja menekan tombol bayar tidak perlu menunggu 15 detik sampai server selesai membuat PDF faktur, memotong stok di 4 gudang, dan mengirim 3 email notifikasi?

Sesi 27 / 343 menit baca

1. Bayangkan Jika

Di sebuah restoran cepat saji, kasir menerima pesanan burger dan uang dari pelanggan. - Skenario Sinkron (Buruk): Kasir meninggalkan meja kasir, berjalan ke dapur, menggoreng daging selama 10 menit, memanggang roti, membungkus burger, lalu menyerahkannya ke pelanggan. Selama 10 menit itu, antrean di kasir mengular sampai ke jalan raya dan toko macet. - Skenario Asinkron (Message Queue): Kasir mencetak struk nomor antrean dalam 2 detik, memberikannya ke pelanggan, lalu melempar tiket pesanan ke atas rel kawat dapur. Pelanggan minggir dengan tenang. Koki dapur mengambil tiket satu per satu sesuai kecepatan kerja mereka. Kasir bisa melayani 500 pelanggan baru tanpa pernah terhambat oleh kecepatan kompor!


2. Apa yang Sebenarnya Terjadi

Dalam arsitektur terdistribusi modern, membedakan Jalur Kritis (Hot Path) dan Jalur Asinkron (Background Job) adalah kunci performa:

  1. Synchronous vs Asynchronous Decoupling: - Hot Path (Sinkron): Hanya memproses hal vital yang mutlak dibutuhkan sekarang (misal: verifikasi saldo & catat transaksi \rightarrow 20 ms). Kembalikan status 202 Accepted atau 200 OK ke user seketika. - Background Job (Asinkron): Kirim event OrderCreated ke Message Broker (Kafka / RabbitMQ).

  2. Dua Jenis Broker Utama: - Queue-Based (RabbitMQ): Pesan dimasukkan ke antrean, diambil pekerja (worker), dan dihapus setelah di-acknowledge (ACK). Sangat cocok untuk task distribution dan routing kompleks. - Log-Based (Apache Kafka): Event disimpan sebagai urutan log terurut (append-only commit log) yang permanen di disk. Banyak grup consumer bisa membaca ulang (replay) data dari offset tertentu tanpa menghapus event. Cocok untuk event stream skala masif.

  3. Consumer Lag (Metrik Paling Jujur): -

    \text{Consumer Lag} = \text{Latest Produced Offset} - \text{Current Consumer Offset}
    - Menunjukkan berapa banyak pesan yang sedang menumpuk antre di broker. Jika Lag terus naik saat beban tinggi, itu alarm merah bahwa worker kurang kapasitas atau macet!

  4. Backpressure & Dead Letter Queue (DLQ): - Backpressure: Mekanisme rem otomatis untuk memberi tahu sistem pengirim (producer) agar memperlambat laju pengiriman saat penampung (consumer) mulai kewalahan. - Poison Pill: Pesan berformat rusak (malformed payload) yang menyebabkan aplikasi consumer mengalami exception crash setiap kali mencoba memprosesnya. Tanpa penanganan, satu pesan racun akan membuat worker restart tanpa henti (infinite crash loop). - Dead Letter Queue (DLQ): Jika sebuah pesan gagal diproses setelah N kali percobaan (misal 3x retry), pesan tersebut otomatis dipindahkan ke "karantina" (DLQ) agar antrean utama tetap jalan lancar, dan tim engineer bisa menginspeksi pesan beracun tersebut secara manual.


3. Nama Resminya

  • Message Broker: Perangkat lunak perantara yang memfasilitasi komunikasi asinkron antar layanan melalui pesan.
  • Consumer Lag: Selisih jumlah pesan antara yang diproduksi dan yang sudah selesai diproses oleh consumer.
  • Backpressure: Sinyal resistensi dari hilir ke hulu untuk mengatur kecepatan aliran data.
  • Dead Letter Queue (DLQ): Antrean sekunder khusus untuk menampung pesan-pesan yang gagal diproses berkali-kali.
  • At-Least-Once Delivery: Jaminan pengiriman pesan di mana pesan dipastikan sampai minimal satu kali (mengharuskan idempotency di sisi consumer).

4. Di Dunia Kita

  • Uber / Gojek Receipt Generation: Struk perjalanan dan perhitungan poin reward diproses via Kafka/SQS di background beberapa detik setelah perjalanan selesai.
  • Tokopedia / Shopee Flash Sale: Notifikasi push dan email konfirmasi pesanan dialirkan via RabbitMQ/Kafka worker pool.

5. Lensa Performance Tester

Metrik dan pengujian krusial: 1. Producer Ingress Throughput: Uji kapasitas publisher menghasilkan 50.000 event/detik tanpa mengalami disk bottleneck. 2. Consumer Lag Drain Rate: Hentikan seluruh consumer selama 10 menit saat traffic 5.000 QPS, lalu nyalakan kembali. Ukur berapa detik waktu yang dibutuhkan consumer pool untuk mengosongkan antrean (drain lag). 3. Poison Pill Isolation: Suntikkan 10 invalid payload (null pointer trigger) di tengah 100.000 pesan normal. Pastikan pesan masuk ke DLQ tanpa merusak worker throughput.


6. Pertanyaan untuk Ronde Berikutnya

Ketika sistem backend sudah tangguh dengan message queue, bagaimana kita memastikan tidak ada satu pun hacker, bot scraper, atau serangan DDoS yang menghabiskan bandwidth dan sumber daya server kita di pintu terluar?

Jawabannya ada di Sesi 28: Membatasi Arus: Rate Limiting, Leaky Bucket, & Token Bucket.