Belajar NATS - KV Store & Object Store
Series/Belajar NATS/Episode 10
Episode 10 of 23

Belajar NATS - KV Store & Object Store

Episode ini membahas dua penyimpanan bawaan JetStream: key-value store dengan TTL, history, watchers, dan update berbasis revision, serta object store untuk menyimpan file besar dalam chunk yang terintegrasi dengan alur data aplikasi.

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

Pendahuluan

Sampai episode 9, NATS hanya mengangkut pesan. Episode 10 ini memperlihatkan sisi NATS yang jarang diketahui banyak orang: ia juga menyediakan penyimpanan data langsung di atas JetStream — key-value store untuk data kecil dan cepat, serta object store untuk file besar.

Keduanya membebaskan kalian dari sistem penyimpanan tambahan untuk banyak kasus sederhana. Mari kita bedah bucket KV, lalu object store.

Key-Value Store: Dasar-Dasar

Membuat Bucket KV

Key-value store NATS hidup dalam bucket. Buat bucket, lalu set dan get nilai:

Bucket KV pertama
nats kv add config
nats kv put config app.name "devvnull"
nats kv get config app.name

nats kv add config membuat bucket bernama config, nats kv put config app.name "devvnull" menyimpan nilai, dan nats kv get config app.name mengambilnya kembali. Di balik layar, bucket KV hanyalah stream dengan retention Limits dan satu subject per key.

Key Bersifat Hierarki

Key mendukung pola titik sehingga bisa diorganisasi:

Key hierarkis dalam bucket
nats kv put config db.host "postgres"
nats kv put config db.port "5432"
nats kv ls config

nats kv ls config mendaftar semua key. Struktur config.db.host memungkinkan pengelompokan key per domain — sama seperti hierarki subject yang dibahas di episode 4.

TTL, History, dan Watchers

TTL untuk Key yang Kadaluarsa

Setiap key bisa diberi waktu hidup (TTL):

Key dengan TTL
nats kv put config session.token "abc123" --ttl=1h

--ttl=1h membuat key session.token otomatis hilang setelah satu jam. TTL sangat berguna untuk cache dan token sementara tanpa perlu cron pembersihan.

History dan Versi

Bucket KV menyimpan riwayat setiap key:

Melihat riwayat key
nats kv history config db.host

nats kv history config db.host menampilkan semua versi key beserta revision number. Riwayat ini yang memungkinkan operasi update yang aman, yang akan kita bahas sebentar lagi.

Watchers: Mendengar Perubahan

Watcher memberitahu aplikasi setiap kali key berubah:

PythonWatch perubahan bucket
import asyncio
import nats
 
async def main():
    nc = await nats.connect("nats://localhost:4222")
    js = nc.jetstream()
    kv = await js.create_key_value(bucket="config")
 
    async for entry in kv.watch("db.host"):
        print("perubahan:", entry.key, entry.value)
 
asyncio.run(main())

kv.watch("db.host") menghasilkan aliran perubahan secara real-time. Kombinasi KV dan watcher ini adalah dasar pola config propagation: satu service mengubah nilai, semua service lain langsung tahu.

Update Aman dengan Revision

Concurrency Control

Saat beberapa service menulis key yang sama, dibutuhkan kontrol agar update tidak saling menimpa. NATS menyediakan revision: setiap operasi tulis punya nomor versi, dan update bisa dipersyaratkan pada revision tertentu.

PythonUpdate dengan guard revision
entry = await kv.get("db.host")
await kv.update("db.host", b"postgres-v2", revision=entry.revision)

kv.update("db.host", b"postgres-v2", revision=entry.revision) hanya berhasil jika revision saat ini masih sama — jika ada service lain yang menulis lebih dulu, operasi gagal. Ini mencegah lost update dan menjadi dasar idempotency yang akan kita pakai di episode 11.

Info

Pola read-modify-write dengan revision adalah cara NATS memberikan jaminan compare-and-swap. Untuk counter atau state bersama antar service, selalu pakai guard revision ini — jangan menulis langsung tanpa cek.

Object Store: Menyimpan File Besar

Konsep Object Store

Object store menyimpan file besar — gambar, video, artifact — dalam bentuk chunk yang tersimpan sebagai pesan JetStream. Keuntungannya: penyimpanan terdistribusi, replikasi, dan akses dari mana saja di cluster.

Bucket object dan upload file
nats object add assets
nats object put assets logo.png ./logo.png
nats object get assets logo.png ./download.png

nats object add assets membuat bucket object, nats object put assets logo.png ./logo.png mengunggah file, dan nats object get mengunduhnya kembali. Client library juga menyediakan API yang sama untuk bahasa masing-masing.

Object Terkait Metadata

Setiap object menyimpan metadata lengkap:

Info object
nats object info assets logo.png
nats object ls assets

nats object info assets logo.png menampilkan ukuran, jumlah chunk, dan waktu upload. nats object ls assets mendaftar semua file di bucket. Object store ini berguna untuk menyimpan hasil proses, model, atau artifact build di dalam ekosistem NATS.

Integrasi dengan Alur Data

Kombinasi dengan Stream dan Worker

Ketiga penyimpanan JetStream saling melengkapi dalam satu alur:

Alur KV dan object store dalam pipeline
publisher --> stream ORDERS --> worker memproses
                                  ├── status di KV bucket
                                  └── hasil file di object store

Pola status di KV bucket memungkinkan setiap worker membaca status terakhir tanpa perlu query stream, sementara hasil file besar disimpan di object store. Ini arsitektur yang ringkas: satu server NATS menangani pesan, state, dan file sekaligus.

Penutup

Episode 10 memperkenalkan dua penyimpanan bawaan NATS: key-value store dengan bucket, TTL, history, watchers, dan update berbasis revision untuk keamanan concurrency, serta object store yang menyimpan file besar dalam chunk terdistribusi. Keduanya berjalan di atas JetStream tanpa komponen tambahan.

Inti yang harus dibawa pulang:

  • Bucket KV dibuat dengan nats kv add dan diakses dengan put, get, dan ls.
  • TTL membuat key kadaluarsa otomatis, ideal untuk cache dan token.
  • Watcher memberi notifikasi real-time setiap key berubah.
  • Revision memungkinkan update dengan guard untuk mencegah lost update.
  • Object store menyimpan file besar sebagai chunk JetStream.
  • KV untuk data kecil, object store untuk file besar, stream untuk pesan.

Di episode 11 selanjutnya kita akan membahas stream manager & work queues — membangun job queue dengan stream WorkQueue dan pull consumer, distribusi pesan unik ke worker, serta exactly-once dan idempotency lewat dedupe window publisher, idempotency key, dan sinkronisasi dengan KV atau database. Pola ini adalah tulang punggung banyak sistem produksi.