Topik temu duga representatif

Temu duga teknikal umum: Mereka bentuk rundingan kandungan HTTP tanpa merosakkan varian cache

UmumSederhana
Pasukan Editorial Offer.ccDiterbitkan Dikemas kini

Soalan

Satu sumber mengembalikan perwakilan yang berbeza mengikut bahasa, pemampatan dan jenis media. Reka bentuk rundingan kandungan dan caching, termasuk Vary, kunci cache, sandaran, privasi dan penyahpepijatan.

Gesaan dan konteks

Soalan teknikal umum ini menguji perwakilan HTTP, rundingan kandungan dan sempadan shared-cache. Matlamatnya adalah untuk membuktikan bahawa proksi tidak boleh menggunakan semula satu bahasa atau pengekodan untuk permintaan lain sambil mengekalkan sandaran (fallback) dan penyelesaian masalah yang boleh dijelaskan.

Perkara yang dinilai oleh penemu duga

  • Sama ada anda membezakan URI sumber daripada perwakilannya dan memahami pengepala rundingan proaktif.
  • Sama ada anda menggunakan Vary untuk mengisytiharkan medan permintaan yang mempengaruhi respons dan menerbitkan kompromi kunci cache serta kadar hit.
  • Sama ada sandaran bahasa, jenis media dan pengekodan adalah deterministik dan bukannya menghasilkan respons 406 yang tidak dapat dijelaskan.
  • Sama ada anda mengenali risiko shared-cache dan privasi daripada kuki, pengesahan, sifat pengguna dan pengepala berkardinaliti tinggi.

Soalan penjelasan untuk ditanya

Sahkan sama ada sumber itu boleh dikongsi secara awam, dimensi varian yang wujud, sama ada rundingan didorong pelayan dibenarkan, sama ada klien boleh memilih bahasa secara eksplisit dan cara CDN membahagikan (shard) mengikut Vary. Tanya tentang sandaran bahasa yang tidak disokong, pengekodan yang dibenarkan, pemperibadian dan kadar hit cache yang boleh diterima.

Kerangka jawapan 30 saat

Saya akan memodelkan URI sumber secara berasingan daripada pemilihan perwakilan, memilih secara deterministik daripada nilai wajaran Accept, Accept-Language dan Accept-Encoding, serta mengembalikan Content-Type, Content-Language, Content-Encoding dan Vary yang tepat. Shared cache hanya menggunakan semula kunci varian yang sama; permintaan yang diperibadikan atau berkardinaliti tinggi akan memintasnya. Apabila tiada perwakilan yang sepadan, gunakan dasar sandaran atau 406 yang didokumenkan, log keputusan tersebut dan uji hit cache, bait dan privasi dengan matriks permintaan.

Perbincangan mendalam langkah demi langkah

1. Tentukan perwakilan dan dimensi rundingan

Anggap satu URI sebagai sumber dengan perwakilan seperti HTML berbanding JSON, bahasa Cina berbanding bahasa Inggeris, atau gzip berbanding br. Sertakan hanya medan permintaan yang mengubah bait respons atau semantik; jangan tambah setiap kuki atau User-Agent penuh untuk kemudahan. Rekod pemilihan supaya input dinormalkan yang serupa menghasilkan perwakilan yang sama.

2. Reka bentuk wajaran, sandaran dan ralat

Huraikan faktor kualiti dan wildcard dalam keluarga Accept serta tentukan senarai dan keutamaan yang disokong pelayan. Bahasa boleh berundur (fallback) daripada rantau kepada bahasa asas dan seterusnya kepada lalai; jenis media boleh mempunyai lalai yang eksplisit. Kembalikan 406 hanya apabila kontrak memerlukan penolakan setiap perwakilan yang tidak boleh diterima. Pilih pemampatan hanya daripada senarai dibenarkan dan jangan biarkan nilai yang tidak diketahui memintasnya.

3. Jadikan varian cache boleh dikira

Senaraikan pengepala pemilihan dalam Vary, contohnya Accept, Accept-Language, Accept-Encoding. Bina kunci varian daripada URI, kaedah dan nilai dinormalkan bagi medan tersebut; penormalan merangkumi huruf besar/kecil, ruang putih dan susunan supaya ejaan yang setara tidak mencipta kunci tanpa had. Jika pengesahan, keadaan sesi atau kuki pengguna mempengaruhi respons, gunakan private cache atau halang perkongsian secara eksplisit.

4. Kawal kadar hit, privasi dan kiraan varian

Setiap dimensi memisahkan cache dan mengurangkan kadar hit. Accept-Language juga boleh menjadi isyarat cap jari pelayar (browser fingerprinting). Halaman awam boleh memetakan bahasa long-tail kepada set terhad yang disokong; data yang diperibadikan menggunakan caching peribadi, jangka hayat pendek atau tiada caching. Jangan gunakan Vary: * untuk menyembunyikan kebergantungan yang tidak diketahui kerana ia menghalang penggunaan semula secara perkongsian.

5. Reka bentuk kebolehcerapan dan pengesahan

Log input rundingan yang dinormalkan, perwakilan yang dipilih, Vary, status cache dan sebab sandaran tanpa merekodkan kuki sensitif penuh. Uji pengepala setiap varian, penyahmampatan, tingkah laku hit dan miss CDN, dan terutamanya jujukan "Bahasa Cina dahulu, Bahasa Inggeris kedua." Semasa insiden, bandingkan Age, status cache, pengepala Content-* dan bait sebenar, kemudian mainkan semula matriks permintaan yang tetap.

Contoh jawapan yang kukuh

Saya akan menyenaraikan set perwakilan terhad dan memilih secara deterministik daripada faktor kualiti dalam Accept, Accept-Language dan Accept-Encoding. Respons mengembalikan Content-Type, Content-Language, Content-Encoding dan Vary yang tepat; kunci cache hanya mengandungi dimensi yang dinormalkan tersebut. Pengesahan, keadaan sesi dan sifat berkardinaliti tinggi kekal di luar shared cache, manakala bahasa awam long-tail kembali kepada lalai. Jika tiada yang boleh diterima, kontrak memilih 406 atau lalai eksplisit. Log merekodkan pilihan, sandaran dan status hit tanpa kuki sensitif, dan matriks seperti "Cina kemudian Inggeris, br kemudian gzip" membuktikan bahawa CDN tidak pernah menggunakan semula varian yang salah.

Kesilapan biasa

  • Menetapkan Content-Language tetapi meninggalkan Vary bagi medan permintaan yang mengubah respons.
  • Memasukkan kuki penuh, User-Agent atau pengepala sewenang-wenangnya ke dalam kunci cache dan memusnahkan kadar hit.
  • Mengembalikan 406 untuk setiap bahasa yang tidak disokong tanpa sandaran rantau, bahasa asas dan lalai.
  • Membiarkan shared cache menggunakan semula respons yang bergantung pada Authorization atau data sesi.
  • Mengabaikan rundingan pengekodan dan mengembalikan Content-Encoding yang tidak boleh dinyahkod oleh klien.
  • Hanya melihat kod status dan bukannya pengepala Content-*, keadaan cache dan bait sebenar.

Soalan dan jawapan susulan

Mengapakah Vary tidak boleh mengandungi Accept-Language sahaja?

Jika jenis media atau pemampatan juga mengubah respons, cache memerlukan dimensi tersebut juga. Meninggalkannya membolehkan shared cache menyampaikan perwakilan yang tidak serasi, menyebabkan kandungan bercampur atau kegagalan penyahkodan.

Bilakah Vary: * berguna?

Ia menyatakan bahawa pemilihan bergantung pada maklumat yang tidak disenaraikan dan biasanya menghalang penggunaan semula secara perkongsian. Ia boleh menjadi perlindungan konservatif, tetapi ia tidak seharusnya menggantikan usaha mengesan kebergantungan sebenar dan memilih private caching.

Bagaimanakah anda menghalang ledakan kunci Accept-Language?

Petakan bahasa klien kepada set terhad yang disokong, lakukan sandaran mengikut rantau, bahasa asas dan lalai. Jika sesuai, gunakan URL eksplisit atau pilihan pengguna untuk mengatasi rundingan automatik dan pantau kadar hit bagi setiap varian.

Patutkah kegagalan rundingan mengembalikan 406 atau perwakilan lalai?

Kontrak antara muka yang menentukannya. API mesin sering memerlukan ralat yang jelas, manakala halaman web mungkin menggunakan sandaran kepada bahasa atau jenis media lalai. Dokumentasikan dan log peraturan yang sama; jangan mengembalikan perwakilan dengan semantik yang salah secara senyap.

Sumber awam

Soalan berkaitan