Gesaan dan skop
Soalan reka bentuk sistem frontend ini menggabungkan pengurusan keadaan (state) dan kemas kini teragih. Jawapannya harus menghubungkan data setempat, baris gilir mutasi (mutation queue), versi pelayan dan keadaan pemulihan yang boleh dilihat berbanding hanya menambah cache semata-mata.
Perkara yang diuji oleh penemu duga
- Mengasingkan draf setempat, mutasi yang belum selesai (pending) dan keadaan yang disahkan oleh pelayan.
- Memilih strategi konflik dan mengenal pasti medan yang tidak boleh digabungkan secara automatik.
- Mengendalikan percubaan semula (retries), penyerahan pendua, pelayar yang ditutup dan berbilang tab.
- Menjadikan keadaan luar talian, penyegerakan, konflik dan kegagalan mudah difahami serta boleh dipulihkan.
Soalan penjelasan untuk ditanya
Tanya sama ada medan-medan adalah bebas dan sama ada terdapat sebarang medan yang diaudit atau berisiko tinggi, seperti wang. Jelaskan tentang lampiran, sokongan versi atau log operasi pelayan, sama ada dasar tulisan-terakhir-menang (last-write-wins) boleh diterima, sokongan pelayar dan keperluan pengekalan data setempat.
Jawapan 30 saat
Saya akan menggunakan IndexedDB sebagai storan setempat yang tahan lama dan merekodkan setiap pengeditan dengan clientMutationId serta versi asas pelayan. UI memaparkan hasil setempat dengan serta-merta dan menandakannya sebagai belum selesai. Aplikasi atau service worker menghantar baris gilir apabila dalam talian. Pelayan membalas dengan status berjaya, konflik atau kegagalan pengesahan menggunakan pemeriksaan versi dan keidempotanan (idempotency). Medan yang selamat boleh digabungkan secara automatik; medan berisiko tinggi memaparkan perbezaan (diff) untuk pilihan eksplisit. Setiap keadaan menyokong percubaan semula atau buat asal (undo).
Analisis terperinci langkah demi langkah
1. Tentukan model keadaan terlebih dahulu
Setiap draf mempunyai serverVersion, localVersion, syncState dan lastError. Setiap mutasi yang belum selesai menyimpan clientMutationId, perubahan medan, masa penciptaan dan versi asas. Operasi membaca datang daripada storan setempat; respons rangkaian hanya digabungkan selepas pemeriksaan versi, supaya respons yang lebih lama tidak boleh menulis ganti pengeditan yang lebih baharu.
2. Kekalkan fakta yang boleh dipulihkan dalam IndexedDB
IndexedDB sesuai untuk data luar talian berstruktur yang lebih besar, tetapi reka bentuk mestilah mengendalikan peningkatan skema, ralat kuota dan pengusiran (eviction) oleh pelayar. Simpan draf, rekod mutasi dan konflik secara berasingan, dan komit draf berserta rekod baris gilurnya dalam satu transaksi. Minimumkan medan sensitif dan padamkannya semasa log keluar atau tamat tempoh.
3. Reka bentuk pencetus penyegerakan dan keidempotanan
Cuba serta-merta semasa dalam talian dan masukkan ke dalam baris gilir semasa luar talian. Di mana Background Sync disokong, daftarkan tag unik untuk service worker, tetapi jangan anggap API tersebut sebagai jaminan penghantaran sejagat. Setiap permintaan membawa clientMutationId dan versi asas; mengulangi ID yang sama mengembalikan hasil yang sama tanpa menggunakan mutasi itu dua kali.
4. Padankan dasar konflik dengan risiko medan
Medan bebas seperti label boleh digabungkan mengikut versi medan. Wang, kebenaran dan penyata pematuhan tidak boleh menggunakan tulisan-terakhir-menang secara senyap. Apabila berlaku konflik, paparkan nilai setempat, nilai pelayan dan masa pengeditan bersebelahan; pilihan pengguna mencipta mutasi baharu. Penggabungan automatik mesti merekodkan inputnya.
5. Kendalikan kegagalan, percubaan semula dan pelbagai konteks
Gunakan pengunduran eksponen (exponential backoff) sambil mengekalkan susunan baris gilir untuk kegagalan rangkaian. Kegagalan pengesahan menjadi keadaan ralat yang boleh diedit dan bukannya percubaan semula tanpa henti. Berbilang tab boleh berkoordinasi melalui BroadcastChannel atau pemeriksaan versi supaya mutasi lama tidak dihantar dua kali. Baris gilir yang tahan lama disambung semula pada pelancaran seterusnya, dan UI menunjukkan bilangan belum selesai serta ralat terakhir.
Contoh jawapan yang kukuh
Saya akan menentukan risiko medan dan sempadan luar talian terlebih dahulu. Klien menyimpan draf dan baris gilir mutasi dalam IndexedDB; setiap mutasi mempunyai clientMutationId dan serverVersion asas, manakala UI memaparkan hasil setempat dengan serta-merta sebagai belum selesai. Aplikasi atau service worker menghantar baris gilir selepas menyambung semula, dan pelayan mengembalikan status berjaya, konflik atau ralat pengesahan menggunakan pemeriksaan versi dan keidempotanan. Medan bebas boleh digabungkan secara automatik, tetapi medan berisiko tinggi memaparkan perbezaan antara setempat dengan pelayan dan memerlukan pengesahan. Kegagalan rangkaian menggunakan pengunduran (backoff); kegagalan perniagaan menjadi boleh diedit. Berbilang tab menggunakan pemberitahuan versi supaya data lapuk tidak boleh menulis ganti kerja yang lebih baharu. Antara muka membezakan dengan jelas antara keadaan luar talian, penyegerakan, konflik, kegagalan dan disimpan.
Kesilapan biasa
- Menyimpan hanya borang terkini dalam cache tanpa baris gilir mutasi atau versi asas.
- Menggunakan cap masa atau tulisan-terakhir-menang pada setiap medan.
- Menganggap Background Sync sebagai jaminan dalam setiap pelayar.
- Mencuba semula tanpa kunci keidempotanan dan mencipta pendua.
- Merekodkan konflik hanya ke konsol tanpa laluan pemulihan untuk pengguna.
- Mengabaikan peningkatan skema, kuota, berbilang tab dan penutupan pelayar.
Soalan susulan dan respons
Bagaimana jika dua tab mengedit pada masa yang sama?
Setiap tab melanggan perubahan versi dan meminta penggabungan apabila asasnya lapuk. Periksa semula versi sebelum menghantar; pelayan masih menyahduplikasi ID mutasi yang dikongsi.
Bolehkah data luar talian bocor?
Simpan medan yang perlu sahaja secara setempat, enkripsi kandungan sensitif, pendekkan tempoh pengekalan dan padamkannya semasa log keluar, penggunaan peranti kongsi atau perubahan dasar.
Bagaimana jika pelayar tiada Background Sync?
Gunakan pelancaran aplikasi, fokus, perubahan ketersambungan dan tinjauan berkala pendek (short polling) sebagai pencetus sandaran, serta maklumkan kepada pengguna bahawa rekod kekal belum selesai. Ketepatan sistem tidak boleh bergantung pada API ini.
Bilakah penggabungan automatik selamat?
Hanya apabila semantik medan adalah bebas, asas versi diketahui dan perbezaan sementara boleh diterima. Medan wang, kebenaran, inventori dan audit harus memerlukan pengesahan eksplisit.