Poin utama
- Jaga batasan domain dan transaksional tetap eksplisit.
- Gunakan idempotency dan job tahan lama untuk pekerjaan eksternal yang rentan gagal.
- Rancang migrasi untuk deployment versi campuran dan volume data nyata.
- Utamakan operasi yang dapat diamati dan reversibel daripada abstraksi yang cerdik.
Default produktif untuk perangkat lunak operasional
Go menyediakan concurrency yang straightforward, binary statis, tooling yang kuat, dan error handling yang eksplisit. PostgreSQL menggabungkan transaksi, constraint relasional, indexing, JSON, full-text search, ekstensi geospasial, dan operasi yang matang.
Nilainya bukan kebaruan benchmark. Melainkan kemampuan untuk memodelkan invarian bisnis penting secara jelas dan men-deploy layanan dengan permukaan operasional yang relatif kecil.
Taruh invarian di dalam batasan transaksional
Metode layanan harus memperjelas read dan write mana yang harus berhasil bersama. Gunakan constraint database untuk keunikan, referensi, validitas, dan jaminan concurrency yang harus berlaku terlepas dari jalur aplikasi.
Hindari transaksi yang menyertakan panggilan jaringan lambat. Commit intent yang tahan lama, kemudian dispatch pekerjaan eksternal melalui outbox atau antrian job dengan handler idempotent.
Rancang retry sebelum kegagalan terjadi
Klien, proxy, dan worker melakukan retry. Tanpa idempotency, timeout dapat membuat langganan, notifikasi, pembayaran, atau ekspor duplikat meskipun setiap komponen berperilaku wajar.
Gunakan kunci idempotency spesifik operasi, simpan status hasil secara transaksional, dan definisikan apakah konflik mengembalikan hasil asli atau menolak input yang berubah. Worker harus mencatat percobaan, kategori error, retry berikutnya, dan kegagalan terminal.
Migrasi adalah perubahan sistem terdistribusi
Selama deployment, versi aplikasi lama dan baru mungkin berjalan terhadap database yang sama. Utamakan perubahan expand-and-contract: tambah struktur yang kompatibel, deploy kode yang dapat menggunakan kedua bentuk, backfill dengan aman, alihkan read, kemudian hapus struktur lama nanti.
Uji lock dan runtime terhadap volume seperti produksi. Perubahan default, indeks, atau tipe yang secara sintaksis sederhana dapat menciptakan contention yang tidak dapat diterima pada tabel besar yang aktif.
Instrumentasikan operasi domain, bukan hanya permintaan HTTP
Latensi permintaan penting, tetapi operator juga memerlukan usia antrian, kategori kegagalan job, konflik transaksi, pengiriman webhook, durasi ekspor, throttling tenant, dan progress migrasi.
Layanan yang baik mengekspos kesehatan tanpa menyembunyikan kegagalan parsial. Log terstruktur, trace, metrik, dan event audit harus berbagi korelasi dan identitas yang aman-tenant sehingga insiden dapat direkonstruksi end-to-end.
Tentang penulis
Centillion Edge Engineering
Tim rekayasa kami menulis tentang keputusan arsitektur, keamanan, data, dan pengiriman di balik sistem enterprise yang andal.