Episode ini membahas consumer JetStream secara lengkap: perbedaan pull dan push consumer, durable versus ephemeral, semantik ack dan nack, ackWait, max delivery untuk redelivery, serta deliver_policy dan replay untuk menentukan titik awal pembacaan.

Episode 8 mengatur bagaimana pesan disimpan di stream. Episode 9 ini mengatur bagaimana pesan dikeluarkan: consumer. Jika stream adalah kolam, consumer adalah keran — dan NATS memberi kalian kendali sangat halus atas keran itu.
Kita akan membedah dua tipe consumer, perbedaan durable dan ephemeral, lalu seluruh semantik pengiriman: ack, nack, ackWait, max delivery, deliver_policy, dan replay. Pahami episode ini dengan baik karena ia menjadi dasar dari work queue dan pipeline streaming.
Push consumer membuat server mengirim pesan langsung ke subscription client tanpa diminta. Ideal untuk jumlah consumer kecil yang selalu online dan memakai subscription biasa.
nats consumer add ORDERS PROCESSOR --deliver subject "processor.orders" --ack explicitPerintah nats consumer add ORDERS PROCESSOR --deliver subject "processor.orders" membuat push consumer PROCESSOR yang mengirim pesan ke subject processor.orders. Aplikasi cukup subscribe di subject itu untuk menerima aliran pesan.
Pull consumer membuat client meminta pesan satu per satu atau dalam batch. Ini pola terbaik untuk banyak worker yang perlu mengontrol kecepatan dan menerapkan backpressure.
nats consumer add ORDERS WORKER --pull --ack explicit--pull menandai consumer sebagai pull. Client meminta pesan dengan fetch atau next, sehingga beban diterima hanya ketika worker siap. Episode 11 akan memakai pull consumer sebagai inti work queue.
| Karakteristik | Push | Pull |
|---|---|---|
| Arah pengiriman | Server ke client | Client meminta |
| Kontrol kecepatan | Flow control server | Client penuh |
| Jumlah consumer | Sedikit | Banyak, bisa ratusan |
| Backpressure | Perlu aturan | Alami |
Durable consumer punya nama dan state yang disimpan server: posisi baca, pesan yang sedang dalam proses, dan ack history. Jika aplikasi restart, consumer melanjutkan dari posisi terakhir.
nats consumer add ORDERS PROCESSOR --durable PROCESSOR --pull --ack explicit--durable PROCESSOR memberikan nama pada consumer. State-nya bertahan di server selama tidak dihapus dengan nats consumer rm.
Ephemeral consumer dibuat tanpa nama dan lenyap ketika koneksi client ditutup. Cocok untuk tugas sementara: analisis singkat, prototipe, atau job yang tidak membutuhkan kelanjutan.
nats consumer add ORDERS TMP --ephemeral --pull --ack explicitPilihan --ephemeral membuat consumer sementara yang otomatis dihapus server saat client terputus. Untuk produksi yang membutuhkan jaminan proses ulang setelah restart, selalu gunakan durable.
Info
Aturan praktis: durable untuk service yang harus selalu melanjutkan posisi baca, ephemeral untuk utilitas sekali jalan. Durable membutuhkan state di server, jadi jangan buat tanpa batas — setiap durable punya nama unik.
Ack menandakan pesan berhasil diproses; nack meminta server mengirim ulang segera; ackWait adalah waktu maksimal menunggu ack sebelum pesan dianggap gagal dan dikirim ulang otomatis.
nats consumer add ORDERS PROCESSOR --pull --ack explicit --ack-wait 30s --max-deliver 5--ack-wait 30s memberi worker 30 detik untuk mengack, dan --max-deliver 5 membatasi pesan hanya dikirim ulang maksimal 5 kali sebelum masuk dead letter. Dua nilai ini mencegah pesan macet selamanya.
Jika worker gagal mengack terus-menerus, pesan dikirim ulang sampai max_deliver tercapai:
nats consumer report ORDERSnats consumer report ORDERS menampilkan berapa banyak pesan yang sedang pending dan berapa kali dikirim ulang. Angka redelivery yang tinggi adalah sinyal worker bermasalah — akan kita bahas sebagai troubleshooting di episode 19.
deliver_policy menentukan pesan pertama yang diterima consumer yang baru dibuat:
new: hanya pesan yang masuk setelah consumer dibuat.all: semua pesan dari awal stream.last: pesan terakhir sebelum consumer dibuat.last_per_subject: pesan terakhir per subject.nats consumer add ORDERS REPLAY --pull --deliver all --replay original--deliver all membuat consumer membaca seluruh history stream, dan --replay original mengirim pesan dengan jeda sesuai kecepatan aslinya. Kebalikannya, --replay instant mengirim secepat mungkin.
Untuk presisi lebih lanjut, tentukan titik awal secara eksplisit:
nats consumer add ORDERS FROM_SEQ --pull --deliver by_start_sequence --start-sequence 5000--start-sequence 5000 memulai pembacaan dari pesan dengan sequence 5000 — berguna untuk me-replay data setelah suatu kejadian. Alternatifnya, --deliver by_start_time --start-time "2026-08-10T00:00:00Z" memulai dari timestamp tertentu.
Episode 9 memberikan kendali penuh atas cara pesan dikeluarkan dari stream: memilih push atau pull consumer, memutuskan durable atau ephemeral, mengatur ack, nack, ackWait, dan max delivery untuk redelivery, serta menetapkan deliver_policy dan replay untuk menentukan titik awal pembacaan.
Inti yang harus dibawa pulang:
max_deliver membatasi jumlah redelivery sebelum dead letter.Di episode 10 selanjutnya kita akan membahas KV store & object store — bucket key-value dengan TTL dan history, watchers untuk notifikasi perubahan, update aman berbasis revision, lalu object store untuk menyimpan file besar dalam chunk, semuanya berjalan di atas JetStream. Data aplikasi kalian mulai hidup di dalam NATS.