Gesaan dan konteks
Aplikasi kerjasama masa nyata mesti menghantar operasi dokumen secara boleh dipercayai sambil menghantar kedudukan kursor dan degupan jantung (heartbeats) yang mungkin digugurkan. Pasukan memilih WebTransport tetapi belum mentakrifkan kelakuan penutupan, perubahan rangkaian, penyambungan semula, tekanan balik, atau pembersihan. Reka bentuk kitaran hayat dan terangkan sempadan antara strim boleh dipercayai, datagram tidak boleh dipercayai, dan sambungan HTTP/3.
API W3C WebTransport mendedahkan strim boleh dipercayai dan datagram tidak boleh dipercayai; RFC 9297 mentakrifkan datagram HTTP. Jawapan yang mantap memisahkan sesi aplikasi daripada pengangkutan dan tidak menganggap close() sebagai bukti bahawa setiap mesej perniagaan telah dihantar.
Perkara yang diuji oleh penemu duga
- Membezakan penutupan sesi, penutupan strim, kehilangan datagram, dan kegagalan rangkaian.
- Mereka bentuk penyambungan semula, pemulihan sesi, nombor jujukan, keidempotetan (idempotency), dan syot kilat (snapshots).
- Mengendalikan tekanan balik strim, had datagram, klien perlahan, dan had sumber.
- Mentakrifkan kod penutupan, sebab, tamat masa (timeouts), dan kebolehcerapan.
- Menetapkan sempadan penyemak imbas, proksi, HTTP/3, dan sandaran (fallback) yang jelas.
Soalan penjelasan
- Mesej manakah yang mesti boleh dipercayai dan teratur, dan mesej manakah yang boleh digugurkan atau dikurangkan kepada nilai terkini?
- Bolehkah sesi dipulihkan merentasi perubahan rangkaian? Apakah masa pemulihan dan sejarah operasi yang boleh diterima?
- Apakah had yang dikenakan pada sesi serentak, strim, dan kadar datagram bagi setiap pengguna?
- Adakah penutupan dimulakan oleh pengguna, penyelenggaraan, tamat tempoh pengesahan, beban lampau, atau ralat protokol?
- Adakah penyemak imbas dan proksi menyokong WebTransport melalui HTTP/3, dan apakah sandaran eksplisitnya?
Jawapan 30 saat
Asingkan ID sesi aplikasi daripada satu sambungan WebTransport. Hantar operasi yang boleh dipercayai melalui strim dengan nombor jujukan dan kunci keidempotetan; hantar kursor dan degupan jantung sebagai datagram yang toleran terhadap kehilangan (lossy). Apabila berlaku kegagalan, kekalkan keadaan sesi sebelah pelayan untuk seketika; sambung semula dengan backoff eksponen dan jujukan disahkan yang terakhir, kemudian pulihkan daripada syot kilat berserta delta. Untuk penutupan anggun, hentikan kerja baharu, salirkan (drain) strim boleh dipercayai, hantar penanda penyiapan aplikasi, tutup dengan kod, dan kuat kuasakan tamat masa tegar (hard timeout). Hadkan setiap penimbal dan sumber.
Jawapan mendalam
1. Mewujudkan sesi aplikasi dan pengangkutan
ID sesi aplikasi mewakili keahlian logik pengguna dalam bilik kerjasama; tika WebTransport ialah satu sambungan rangkaian. Selepas jabat tangan (handshake), sahkan asal (origin), pengesahan, penyewa (tenant), dan kebenaran bilik, cipta ID sambungan, dan petakannya kepada sesi aplikasi. Penyambungan semula mencipta ID sambungan baharu dan tidak sekali-kali memberikan sesi pengguna lain.
Simpan jujukan operasi terakhir yang disahkan, versi syot kilat, langganan, dan masa tamat tempoh. Selepas terputus, tandakan keadaan aplikasi sebagai digantung untuk TTL yang singkat sebelum melepaskannya.
2. Memilih strim atau datagram bagi setiap mesej
Operasi dokumen, perubahan kebenaran, dan perakuan (acknowledgements) menggunakan strim boleh dipercayai dengan pembingkaian eksplisit, versi, nombor jujukan, dan kunci keidempotetan. Kursor, metrik langsung, dan degupan jantung menggunakan datagram, dengan penerima membuang cap masa atau versi lapuk. Jangan sekali-kali meletakkan peristiwa perniagaan yang wajib dihantar ke dalam datagram.
Datagram tidak memberikan jaminan penghantaran, susunan, atau penghantaran semula dan mempunyai had saiz laluan serta pelaksanaan. Ukur kehilangan dan kependaman, kurangkan kekerapan, atau hantar keadaan terkini sahaja. Strim boleh dipercayai menggunakan tekanan balik WritableStream dan bukannya baris gilir memori tanpa batasan.
3. Mengendalikan tekanan balik dan klien perlahan
Tetapkan tetingkap penghantaran, had perakuan belum selesai, dan saiz bingkai maksimum bagi setiap strim boleh dipercayai. Apabila penulisan kekal belum selesai, jedakan pengeluar; apabila tamat masa, putuskan sambungan atau kurangkan langganan tidak kritikal. Gunakan baldi token (token buckets) dan belanjawan setiap sesi untuk datagram; menggugurkan kursor lama adalah lebih baik daripada menyekat operasi dokumen.
Hadkan juga kiraan sesi, kiraan strim, penyahkodan serentak, dan jumlah memori. Agregatkan metrik mengikut penyewa supaya satu klien yang perlahan tidak boleh menggunakan gelung peristiwa (event loop) sepenuhnya.
4. Mereka bentuk pemutusan sambungan dan pemulihan
Klien menetapkan nombor jujukan tempatan dan kunci keidempotetan kepada operasi yang boleh dipercayai serta memajukan titik pemeriksaan (checkpoint) selepas perakuan. Jabat tangan penyambungan semula membawa ID sesi, jujukan terakhir yang disahkan, dan keupayaan. Pelayan mengesahkan pemilikan sesi dan mengembalikan syot kilat, delta, atau ralat yang tidak boleh dipulihkan.
Jedakan kesan sampingan baharu semasa pemulihan supaya sambungan lama dan baharu tidak boleh menyerahkan data secara serentak. Gunakan epok (epoch) untuk membatalkan penulisan daripada sambungan lama dan buka semula pengeluar hanya selepas pemulihan selesai.
5. Mereka bentuk penutupan anggun
Semasa penyelenggaraan, siarkan status penyaliran (draining), tolak sesi baharu, dan hentikan datagram tidak kritikal. Biarkan strim boleh dipercayai menyelesaikan bingkai semasa dan menghantar penanda penyiapan aplikasi, kemudian tutup sesi selepas menunggu dalam tempoh yang terhad. close() penyemak imbas menyampaikan penutupan sesi dan maklumat penutupan; ia bukan perakuan perniagaan.
Kelaskan kod penutupan untuk keluar normal, tamat tempoh pengesahan, beban lampau, ralat protokol, dan penyelenggaraan. Pastikan sebab penutupan ringkas dan tidak sensitif. Apabila mencapai had tamat masa tegar, lepaskan sumber serta-merta dan rekodkan operasi yang belum selesai.
6. Menyemak semula pengesahan dan perubahan rangkaian
Setiap sambungan baharu atau yang dipulihkan mengesahkan semula kelayakan, asal, penyewa, dan kebenaran bilik. Jangan pulihkan berdasarkan ID sesi sahaja. Perubahan rangkaian mungkin mengubah alamat; pemulihan aplikasi menggunakan sambungan baharu, manakala epok menghalang laluan lama daripada menulis.
Jika WebTransport atau HTTP/3 tidak tersedia, rundingkan sandaran secara eksplisit dan nyatakan semula perbezaan kebolehpercayaan, kependaman, dan keselamatan. Jangan gunakan semantik penutupan WebSocket pada datagram.
7. Memerhati dan menguji mod kegagalan
Rekodkan penciptaan sambungan, kegagalan jabat tangan, kod dan sebab penutupan, tekanan balik strim, datagram yang digugurkan, kiraan penyambungan semula, tempoh pemulihan, dan operasi yang belum diperakui. Jangan log token atau kandungan dokumen yang sensitif. Segmentasikan metrik mengikut klien, jenis rangkaian, dan penyewa.
Uji penyelenggaraan, perubahan rangkaian mudah alih, pemblokiran proksi HTTP/3, klien perlahan, lonjakan datagram, dan penyambungan semula pendua. Kriteria penerimaan merangkumi ketiadaan kesan sampingan pendua, had pemulihan yang jelas, pembersihan sesi tamat tempoh, dan kependaman penutupan yang terhad.
Jawapan model
Saya akan mengasingkan sesi aplikasi daripada sambungan WebTransport. Operasi dokumen yang boleh dipercayai menggunakan strim dengan nombor jujukan dan kunci keidempotetan; kursor dan degupan jantung menggunakan datagram toleran kehilangan. Klien menyimpan titik pemeriksaan dan menyambung semula dengan ID sesi serta jujukan terakhir yang disahkan. Pelayan mengesahkan pengguna dan penyewa, memulihkan daripada syot kilat berserta delta, dan menggunakan epok untuk membatalkan penulisan lama.
Penutupan anggun memasuki mod penyaliran, menghentikan mesej baharu dan datagram tidak kritikal, menyalirkan strim boleh dipercayai, menghantar penanda penyiapan aplikasi, kemudian menutup dengan kod dan tamat masa tegar. Hadkan sesi, strim, penimbal, dan penyambungan semula; pantau kehilangan, tekanan balik, sebab penutupan, dan masa pemulihan. Rundingkan sebarang sandaran secara eksplisit.
Kesilapan biasa
- Menganggap datagram sebagai mesej boleh dipercayai atau
close()sebagai perakuan perniagaan. - Mencipta sambungan baharu selepas kegagalan tanpa titik pemeriksaan, epok, atau kunci keidempotetan.
- Menimbal data klien perlahan secara berterusan sehingga menghabiskan memori atau gelung peristiwa.
- Memulihkan melalui ID sesi tanpa mengesahkan semula pengguna, penyewa, asal, dan kebenaran.
- Meninggalkan penyaliran, tamat masa tegar, atau audit operasi yang belum selesai semasa penutupan.
- Mengabaikan pemblokiran HTTP/3, sokongan penyemak imbas, dan kelakuan proksi.
- Melog token lengkap, kandungan dokumen, atau sebab penutupan yang sensitif.
Soalan susulan dan jawapan
Apakah yang sesuai diletakkan dalam datagram?
Nilai sementara yang toleran terhadap kehilangan seperti kursor, postur sementara, dan degupan jantung berfrekuensi tinggi. Operasi perniagaan yang wajib sampai menggunakan strim boleh dipercayai.
Bagaimanakah anda menghalang operasi pendua selepas penyambungan semula?
Tetapkan kunci keidempotetan dan nombor jujukan, nyahduplikasi mengikut sesi dan epok pada pelayan, dan majukan titik pemeriksaan hanya selepas perakuan diterima.
Bagaimanakah penutupan penyelenggaraan sepatutnya berfungsi?
Hentikan sesi baharu dan siarkan penyaliran, hentikan datagram tidak kritikal, salirkan strim boleh dipercayai, hantar penanda penyiapan, kemudian tutup secara normal. Paksa pembersihan apabila tamat masa tegar dicapai.
Apakah yang berlaku apabila TTL sesi tamat tempoh?
Kembalikan ralat yang tidak boleh dipulihkan dan perlukan pengesahan semula serta penyertaan semula. ID sesi lama tidak boleh melanjutkan kebenaran.
Bagaimana jika datagram terlalu besar atau kadar kehilangan tinggi?
Hadkan saiz dan kadar, mampatkan atau gabungkan keadaan (coalesce), dan simpan nilai terkini sahaja. Peristiwa perniagaan tidak boleh bergantung pada datagram yang tidak boleh dipercayai.
Bagaimanakah anda membuktikan bahawa sandaran mengekalkan semantik?
Dokumenkan perbezaan kebolehpercayaan, penyusunan, pemulihan, dan pengesahan bagi setiap protokol. Uji pemutusan sambungan, pemblokiran proksi, klien perlahan, dan penyambungan semula pendua sambil mengukur kesan sampingan pendua.