Gesaan dan skop
Andaikan 20,000 penyewa (tenants) dan 1 juta operasi setiap jam, dengan lonjakan singkat 10x dan keputusan kebenaran p95 di bawah 100 ms. Pelanggan membeli kredit sebelum menjalankan operasi. Setiap operasi mempunyai kos yang boleh berubah, permintaan boleh tiba secara serentak, dan penghantaran peristiwa penggunaan adalah sekurang-kurangnya sekali (at-least-once). Reka bentuk mesti mengelakkan baki negatif dan caj berganda sambil mengekalkan jejak audit. Ini ialah lejar nilai yang dibeli, bukan pengehad kadar (rate limiter) atau sistem pengebilan langganan berulang.
Perkara yang sedang diuji oleh penemu duga
- Mengasingkan pergerakan kredit tak boleh ubah (immutable) daripada model bacaan baki yang pantas.
- Menjadikan operasi authorize, capture, release, refund, dan grant bersifat idempoten.
- Mengendalikan permintaan serentak, peristiwa tertangguh, percubaan semula, tempoh luput, dan penyelarasan.
- Menjelaskan sempadan ketekalan (consistency boundaries), penyewa hangat (hot tenants), kebolehcerapan, dan pemulihan.
Soalan penjelasan untuk ditanya
Tanya sama ada kredit mempunyai tempoh luput, sama ada operasi yang gagal boleh membuat tempahan kemudian melepaskannya, cara bayaran balik diluluskan, sama ada kos diketahui sebelum pelaksanaan, dan sama ada satu penyewa boleh berbelanja di beberapa rantau. Sahkan kependaman keputusan yang diperlukan dan sama ada kebenaran berlebihan sementara dibenarkan.
Jawapan 30 saat
Saya akan menggunakan lejar tambah sahaja (append-only) yang tidak boleh diubah bagi pemberian (grants), tempahan (reservations), tangkapan (captures), pelepasan (releases), bayaran balik (refunds), dan luput (expirations). Unjuran baki transaksi menyokong bacaan pantas, manakala kunci keidempotenan menjadikan setiap mutasi boleh diulang. Kebenaran secara atomik menyemak kredit yang tersedia dan mencipta tempahan dengan masa luput; kerja yang berjaya akan menangkapnya (capture), kegagalan akan melepaskannya (release), dan penuntut semula (reclaimer) mengendalikan tempahan yang terbiar. Peti keluar (outbox), peristiwa yang boleh dimainkan semula, dan penyelarasan membandingkan unjuran dengan lejar serta membaiki hanyutan (drift) dengan entri pampasan yang boleh diaudit.
Perbincangan mendalam langkah demi langkah
1. Memodelkan keadaan kredit
Kekalkan satu kunci penyewa/akaun, unit kredit integer, jujukan lejar, dan unjuran yang mengandungi jumlah yang diberikan, ditempah, ditangkap, dilepaskan, dibayar balik, dan luput. Simpan setiap mutasi bersama operationid, idempotencykey, sebab, pelaku, dan cap masa. Jangan sekali-kali mengedit entri lama; pembetulan dilakukan dengan menambah entri pampasan.
2. Memberi kebenaran tanpa perbelanjaan berganda
Gunakan satu transaksi atau kemas kini bersyarat yang boleh dilinearkan (linearizable conditional update) untuk kunci hangat penyewa: cipta tempahan hanya apabila kredit yang tersedia sekurang-kurangnya bersamaan dengan kos yang diminta. Kunci keidempotenan yang berulang mengembalikan keputusan asal; kunci yang digunakan semula dengan parameter berbeza akan ditolak. Kekalkan tempoh luput tempahan dan peralihan status secara bersyarat supaya capture dan release tidak boleh menang kedua-duanya.
3. Menyambungkan pelaksanaan dan peristiwa
Permintaan perniagaan membawa pengecam tempahan. Capture menyusuli kejayaan yang disahkan; release menyusuli operasi yang gagal atau dibatalkan. Peristiwa penggunaan mungkin pendua atau tertangguh, jadi pengguna (consumers) menyahduplikasi mengikut event_id dan menyelaraskan tempahan yang tidak diketahui dan bukannya mengurangkan kaunter secara membuta tuli. Peti keluar menerbitkan perubahan lejar yang telah disahkan (committed) selepas transaksi.
4. Skala, alternatif, dan pemulihan
Bahagikan mengikut penyewa, halakan satu penyewa ke penulis utama (home writer), dan asingkan penyewa yang sangat aktif dengan kawalan kemasukan (admission control) atau aliran arahan bersiri. Transaksi hubungan adalah pilihan yang lebih mudah apabila kadar penulisan setiap penyewa adalah sederhana; aliran arahan bersumberkan peristiwa (event-sourced command stream) lebih diutamakan untuk penyewa yang sangat aktif apabila main semula dan susunan lebih penting daripada kesederhanaan pertanyaan. Bacaan boleh menggunakan replika hanya apabila tahap kelapukannya (staleness) dipaparkan. Pembersih (sweeper) meluputkan tempahan yang terbiar, dan main semula membina semula unjuran daripada lejar. Makluman merangkumi ketersediaan negatif, penangkapan selepas luput, kelengahan main semula, dan perbezaan penyelarasan.
Contoh jawapan yang mantap
Saya akan menjelaskan tempoh luput, kuasa bayaran balik, perbelanjaan berbilang rantau, dan sama ada kos diketahui sebelum pelaksanaan. Punca kebenaran (source of truth) ialah lejar per penyewa yang tidak boleh diubah; jadual baki ialah unjuran yang boleh dibina semula. authorize menempah kos secara atomik di bawah kunci keidempotenan dan tempoh luput, capture menukar tempahan tersebut selepas kejayaan, dan release atau tempoh luput mengembalikannya. Peristiwa pendua atau tertangguh dinyahduplikasi dan diselaraskan. Penulisan afiniti penyewa mengelakkan perbelanjaan berganda merentas rantau; jika sesuatu rantau mesti beroperasi secara bebas, ia menerima peruntukan terhad yang hutangnya diselaraskan secara eksplisit. Setiap pembetulan ialah entri pampasan tambah sahaja.
Kesilapan lazim
- Kaunter boleh ubah sahaja → percubaan semula dan bayaran balik tidak boleh diaudit → tambah entri tak boleh ubah dengan identiti operasi.
- Caj semasa penerimaan permintaan → kerja yang gagal masih menghabiskan kredit → tempah dahulu dan tangkap (capture) hanya selepas berjaya.
- Percubaan semula dianggap sebagai penggunaan baharu → satu operasi dicaj dua kali → gunakan semula kunci keidempotenan yang sama.
- Tempahan tidak pernah dituntut semula → pekerja yang ranap mengunci kredit selama-lamanya → tambah tempoh luput dan pembersih bersyarat.
- Bacaan merentas rantau yang konsisten akhirnya (eventually consistent) → dua penulis boleh berbelanja berlebihan → gunakan satu penulis atau belanjawan serantau yang eksplisit.
- Edit baris lama untuk membetulkan sejarah → jejak audit menjadi tidak boleh dipercayai → tambah entri pampasan.
Soalan susulan dan jawapan
Klien mengalami tamat masa (timeout) selepas kebenaran. Apa yang berlaku?
Buat pertanyaan pada tempahan atau cuba semula peralihan seterusnya dengan kunci keidempotenan yang sama. Jangan beri kebenaran lagi sehingga tempahan asal ditangkap, dilepaskan, atau luput.
Bagaimanakah anda memproses bayaran balik selepas bulan ditutup?
Tambah entri bayaran balik yang merujuk kepada tangkapan asal dan rekod kelulusan. Unjuran meningkatkan kredit yang tersedia, manakala lejar mengekalkan kedua-dua peristiwa dan susunannya.
Bolehkah dua rantau membelanjakan akaun yang sama secara serentak?
Utamakan penulis tunggal atau rantau utama penyewa untuk semantik tiada perbelanjaan berganda yang ketat. Jika perbelanjaan tempatan terhad diperlukan, peruntukkan belanjawan serantau yang eksplisit dan selaraskan hutang; nyatakan lebihan sementara maksimum.
Bagaimanakah anda membuktikan baki adalah betul?
Mainkan semula lejar secara berkala, bandingkan jumlah tersedia yang diperoleh dengan unjuran, dan bandingkan penangkapan dengan hasil operasi perniagaan. Keluarkan entri pampasan idempoten dan rekod audit untuk setiap pembaikan.