Service Pencarian Katalog dengan Go
Microservice Go yang menyimpan seluruh katalog produk di memori dan melayani pencarian tanpa menyentuh basis data. Pembacaan bebas kunci lewat atomic pointer, sehingga penyegaran data tidak pernah memblokir permintaan.
Microservice pencarian produk in-memory berbahasa Go yang melayani etalase Tree Coffee. Postgres tetap menjadi sumber kebenaran; layanan ini memuat snapshot read-only ke RAM dan menjawab setiap pencarian dari memori, tanpa satu pun perjalanan ke basis data per kueri.
Sorotan
- Pembacaan tanpa kunci lewat pointer snapshot atomik — store membungkus snapshot-nya dalam
atomic.Pointer[Snapshot], sehingga pembaca tidak pernah mengambil lock dan penulis tidak pernah menghalangi mereka. Proses refresh membangun snapshot baru seutuhnya lalu menukar pointernya, yang berarti tidak ada pembacaan terkoyak dan tidak ada katalog setengah jadi yang terlihat oleh request di tengah pertukaran. - Refresh yang gagal tetap menyajikan data lama — bila pemuatan ulang dari Postgres gagal, snapshot sebelumnya tetap dipakai. Layanan turun mutu menjadi hasil yang basi alih-alih mengembalikan error, dan itulah mode kegagalan yang benar untuk sebuah kotak pencarian.
- Port tidak dibuka sebelum datanya siap —
Bootstrap()mencoba ulang dengan backoff dan wajib berhasil sebelum listener HTTP menyala, sehingga layanan tidak pernah bisa dijangkau dalam keadaan kosong yang akan menjawab "produk tidak ditemukan" kepada pelanggan sungguhan. - Normalisasi dilakukan sekali saat pemuatan, bukan per request — nama, deskripsi, merek, dan tag diubah ke huruf kecil ketika snapshot dibangun. Melakukannya per kueri berarti mengulang pekerjaan yang sama pada setiap ketukan tombol di kotak pencarian yang mencari sambil diketik.
- Perangkingan berjenjang yang meniru full-text search tanpa basis data — kecocokan nama persis mengungguli awalan nama, yang mengungguli nama yang mengandung, yang mengungguli kecocokan kata, yang mengungguli kecocokan lemah. Ia menghadirkan kembali bagian berguna dari perangkingan full-text Postgres di dalam memori.
- Produk nonaktif tidak pernah masuk RAM — loader menyaring
is_active = truedi level SQL, sehingga stok yang dinonaktifkan tidak bisa bocor ke hasil lewat satu pemeriksaan yang terlupa di kode aplikasi. - DTO API sengaja dibuat lebih sempit dari modelnya — stok flash sale, jumlah terjual, dan prioritas ada di dalam kueri dan model internal tetapi sengaja tidak diekspos, agar keadaan penjualan internal tidak berubah menjadi field publik karena kelalaian.
Fitur Utama
- Endpoint pencarian produk — perangkingan relevansi berjenjang di atas snapshot in-memory, menjawab tanpa menyentuh Postgres.
- Refresh terautentikasi —
POST /admin/refreshmembangun ulang snapshot sesuai permintaan di balik bearer token, sehingga perubahan katalog bisa diterbitkan tanpa deploy ulang. - Endpoint kesehatan —
/healthz, tersambung ke pemeriksaan kesehatan 15 detik milik Fly.io. - Bootstrap snapshot dengan backoff — proses awal mencoba ulang sampai katalog termuat, baru kemudian membuka port.
- Build Docker multi-stage — image runtime yang kecil dihasilkan dari tahap build yang lengkap.
- Deployment yang bisa turun ke nol — mesin berhenti dan menyala otomatis dengan
min_machines_running = 0di atas VM 512 MB ber-CPU bersama.
Tech Stack
- Go 1.26.4
- Fiber v2.52 (framework HTTP, di atas fasthttp)
- pgx/v5 + pgxpool (akses Postgres ke Supabase)
- Build Docker multi-stage
- Fly.io, region utama
sin(Singapura)
Status & Kematangan
Aktif, melayani baik etalase SvelteKit maupun aplikasi Android. Berupa modul tunggal, bukan monorepo — main.go plus tiga paket (internal/config, internal/handlers, internal/store) — tanpa Makefile, tanpa linter, dan tanpa CI di dalam repositori, sehingga go build, go vet, gofmt -l, dan go test dijalankan manual sebagai garis pertahanan minimum. Kelima test-nya hanya memakai pustaka standar, tanpa testify dan tanpa mock.
Metrik Terukur
| Commit | 12 |
| Rentang Tanggal | 9 Jul 2026 – 15 Jul 2026 |
| Baris kode | 3.120 |
| Test | 5 test, semua lulus |