Episode ini memperkenalkan JetStream sebagai lapisan persistence NATS: konsep stream sebagai log persisten, retention dan durability, cara mengaktifkan JetStream, serta alur pesan dari publish menuju stream dan dari stream menuju consumer.

Sampai episode 6, kalian bekerja dengan Core NATS: cepat dan ringan, tapi pesan tidak disimpan. Episode 7 ini membuka babak baru: JetStream, lapisan persistence yang menjadikan NATS sistem messaging yang tahan lama. Inilah alasan NATS mampu bersaing dengan broker streaming berstateful.
Kita akan membahas konsep stream sebagai log persisten, retention dan durability, cara mengaktifkan JetStream, serta alur lengkap publish menuju stream dan dari stream menuju consumer. Ini pijakan untuk episode 8 dan 9.
Core NATS dirancang at-most-once: pesan dikirim secepat mungkin dan dibuang jika tidak ada subscriber. Konsekuensinya, pesan bisa hilang ketika subscriber sedang offline, service sedang restart, atau publisher crash setelah mengirim.
publisher --> subject --> (tidak ada subscriber) --> pesan dibuangSkema pesan dibuang di atas tidak bisa diterima untuk payment, job queue, atau audit log. JetStream menjawab: simpan pesan di server sampai consumer siap menerimanya.
JetStream memberi jaminan at-least-once: pesan disimpan di stream, dikirim ke consumer, dan hanya dihapus setelah consumer mengack. Jika consumer gagal mengack dalam batas waktu, pesan dikirim ulang. Tidak ada pesan yang hilang — paling buruk, pesan terkirim lebih dari sekali.
Stream adalah log pesan yang menangkap subject-subject tertentu. Stream memiliki identitas, daftar subject, dan aturan penyimpanan:
stream ORDERS:
subjects: orders.>
retention: limits
storage: file
max_age: 30 hari
max_bytes: 1 GBBlok stream ORDERS di atas menangkap semua pesan orders.>, menyimpannya di disk maksimal 30 hari atau 1 GB. Detail lengkap tiap field akan dibahas di episode 8.
Consumer adalah entitas yang membaca pesan dari stream. Ia punya state sendiri: pesan mana yang sudah dikirim, mana yang menunggu ack, mana yang harus diulang. Consumer bisa push (server mengirim ke client) atau pull (client meminta).
| Karakteristik | Core NATS | JetStream |
|---|---|---|
| Penyimpanan | Tidak ada | Stream berbasis file/memory |
| Jaminan | At-most-once | At-least-once dengan ack |
| Replay | Tidak bisa | Bisa dari sequence tertentu |
| State | Stateless | Consumer punya state |
Perbedaan at-most-once versus at-least-once ini adalah garis pemisah utama antara dua mode NATS.
JetStream bisa diaktifkan saat menjalankan server dengan flag -js:
nats-server -p 4222 -jsnats-server -p 4222 -js mengaktifkan JetStream dengan konfigurasi default. Untuk produksi, gunakan blok konfigurasi:
jetstream {
store_dir: /data/jetstream
max_mem_store: 1G
max_file_store: 10G
max_mem: 512M
}Blok jetstream menentukan lokasi penyimpanan dan batas resource. Tanpa blok ini, JetStream memakai store di direktori sementara — tidak cocok untuk data yang harus bertahan.
Dengan JetStream aktif, buat stream pertama via CLI:
nats stream add ORDERS --subjects "orders.>" --storage file --retention limitsnats stream add ORDERS --subjects "orders.>" membuat stream ORDERS yang menangkap semua subject orders.>. CLI akan menanyakan beberapa opsi interaktif; jawab dengan nilai default untuk saat ini.
Alur JetStream dimulai dari publish. Pesan yang dipublish ke subject yang masuk daftar stream akan disalin ke stream:
nats pub orders.created "pesanan-1"
nats stream view ORDERSnats stream view ORDERS menampilkan seluruh pesan yang tersimpan di stream. Perhatikan: pesan pesanan-1 tersimpan meski tidak ada subscriber — inilah kekuatan JetStream.
Info
Publish ke JetStream berbeda dari Core NATS: gunakan nats pub dengan opsi ack, atau publish memakai client library dengan flag publish-async dan publish-ack. Server mengembalikan acknowledgment setelah pesan aman di stream — jaminan data masuk.
publisher
└── publish ke subject:orders.created
└── stream ORDERS menyimpan pesan
└── consumer NEW membaca pesan
└── aplikasi memproses dan ackAlur di atas adalah inti mental model JetStream: publish masuk stream, stream menyimpan, consumer mengirim, aplikasi mengack. Episode 8 dan 9 akan membedah setiap lapisnya.
Pastikan pesan benar-benar tersimpan:
nats stream info ORDERS
nats stream reportnats stream info ORDERS menampilkan jumlah pesan, ukuran, dan waktu pesan terakhir. nats stream report merangkum kesehatan semua stream. Dua perintah ini akan menjadi teman troubleshooting di episode 19.
Episode 7 membuka pintu JetStream: memahami keterbatasan Core NATS yang at-most-once, konsep stream sebagai log persisten dan consumer sebagai pembaca berstate, at-least-once via ack, cara mengaktifkan JetStream dengan -js atau blok konfigurasi, serta alur publish menuju stream menuju consumer.
Inti yang harus dibawa pulang:
-js atau blok jetstream di konfigurasi.nats stream add membuat stream; nats stream view menampilkan isinya.Di episode 8 selanjutnya kita akan membahas JetStream streams — konfigurasi subjects, retention dengan mode Limits, Interest, dan WorkQueue, storage file atau memory, batasan max_age dan max_bytes, replikasi replicas, serta stream sourcing, mirroring, dan dedupe window untuk exactly-once publish. Di sinilah stream diatur presisi.