Belajar NATS - JetStream: Pendahuluan
Episode 7 of 23

Belajar NATS - JetStream: Pendahuluan

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.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

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.

Mengapa Persistence Diperlukan

Keterbatasan Core NATS

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.

Pesan hilang tanpa persistence
publisher --> subject --> (tidak ada subscriber) --> pesan dibuang

Skema pesan dibuang di atas tidak bisa diterima untuk payment, job queue, atau audit log. JetStream menjawab: simpan pesan di server sampai consumer siap menerimanya.

At-Least-Once via Acknowledgment

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.

Konsep Dasar JetStream

Stream: Log Pesan Persisten

Stream adalah log pesan yang menangkap subject-subject tertentu. Stream memiliki identitas, daftar subject, dan aturan penyimpanan:

Deskripsi konseptual stream
stream ORDERS:
  subjects: orders.>
  retention: limits
  storage: file
  max_age: 30 hari
  max_bytes: 1 GB

Blok 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: Cara Membaca Stream

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).

Perbedaan Core NATS dan JetStream

KarakteristikCore NATSJetStream
PenyimpananTidak adaStream berbasis file/memory
JaminanAt-most-onceAt-least-once dengan ack
ReplayTidak bisaBisa dari sequence tertentu
StateStatelessConsumer punya state

Perbedaan at-most-once versus at-least-once ini adalah garis pemisah utama antara dua mode NATS.

Mengaktifkan JetStream

Flag -js dan Blok Konfigurasi

JetStream bisa diaktifkan saat menjalankan server dengan flag -js:

Mengaktifkan JetStream dengan flag
nats-server -p 4222 -js

nats-server -p 4222 -js mengaktifkan JetStream dengan konfigurasi default. Untuk produksi, gunakan blok konfigurasi:

Konfigurasi JetStream
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.

Membuat Stream Pertama

Dengan JetStream aktif, buat stream pertama via CLI:

Membuat stream ORDERS
nats stream add ORDERS --subjects "orders.>" --storage file --retention limits

nats 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 Publish ke Stream

Dari Subject ke Stream

Alur JetStream dimulai dari publish. Pesan yang dipublish ke subject yang masuk daftar stream akan disalin ke stream:

Publish ke subject yang ditangkap stream
nats pub orders.created "pesanan-1"
nats stream view ORDERS

nats 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.

Alur publish menuju stream menuju consumer

Alur lengkap JetStream
publisher
  └── publish ke subject:orders.created
        └── stream ORDERS menyimpan pesan
              └── consumer NEW membaca pesan
                    └── aplikasi memproses dan ack

Alur di atas adalah inti mental model JetStream: publish masuk stream, stream menyimpan, consumer mengirim, aplikasi mengack. Episode 8 dan 9 akan membedah setiap lapisnya.

Verifikasi Persistence

Cek Stream dan Konsumsinya

Pastikan pesan benar-benar tersimpan:

Cek detail stream
nats stream info ORDERS
nats stream report

nats 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.

Penutup

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:

  • Core NATS at-most-once; JetStream menawarkan at-least-once.
  • Stream adalah log pesan persisten yang menangkap subject tertentu.
  • Consumer membaca stream dan menyimpan state pengiriman.
  • Aktifkan JetStream dengan flag -js atau blok jetstream di konfigurasi.
  • nats stream add membuat stream; nats stream view menampilkan isinya.
  • Pesan tersimpan meski tidak ada subscriber — itulah persistence.

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.

Belajar NATS - JetStream: Pendahuluan | Belajar NATS