Topik wawancara representatif

Wawancara teknis umum: Merancang negosiasi konten HTTP tanpa merusak varian cache

UmumSedang
Tim Redaksi Offer.ccDipublikasikan Diperbarui

Pertanyaan

Sebuah resource mengembalikan representasi berbeda berdasarkan bahasa, kompresi, dan tipe media. Rancang negosiasi konten dan caching, termasuk Vary, cache key, fallback, privasi, dan debugging.

Prompt dan konteks

Pertanyaan teknis umum ini menguji representasi HTTP, negosiasi konten, dan batas-batas shared-cache. Tujuannya adalah membuktikan bahwa proxy tidak dapat menggunakan kembali satu bahasa atau encoding untuk permintaan lain sambil tetap menjaga fallback dan troubleshooting dapat dijelaskan.

Apa yang dievaluasi oleh pewawancara

  • Apakah Anda membedakan URI resource dari representasinya dan memahami header negosiasi proaktif.
  • Apakah Anda menggunakan Vary untuk mendeklarasikan field permintaan yang memengaruhi respons dan menurunkan trade-off cache-key serta hit-rate.
  • Apakah fallback bahasa, tipe media, dan encoding bersifat deterministik dan tidak menghasilkan respons 406 yang tidak dapat dijelaskan.
  • Apakah Anda mengenali risiko shared-cache dan privasi dari cookie, otorisasi, karakteristik pengguna, dan header berkardinalitas tinggi.

Pertanyaan klarifikasi yang perlu diajukan

Konfirmasikan apakah resource dapat dibagikan secara publik, dimensi varian apa saja yang ada, apakah negosiasi yang digerakkan oleh server (server-driven) diizinkan, apakah klien dapat memilih bahasa secara eksplisit, dan bagaimana CDN melakukan sharding berdasarkan Vary. Tanyakan tentang fallback bahasa yang tidak didukung, encoding yang diizinkan, personalisasi, dan target cache hit rate yang dapat diterima.

Kerangka jawaban 30 detik

Saya akan memodelkan URI resource secara terpisah dari pemilihan representasi, memilih secara deterministik dari nilai bobot Accept, Accept-Language, dan Accept-Encoding, serta mengembalikan Content-Type, Content-Language, Content-Encoding, dan Vary yang akurat. Shared cache hanya menggunakan kembali variant key yang sama; permintaan yang dipersonalisasi atau berkardinalitas tinggi akan mem-bypass-nya. Ketika tidak ada representasi yang cocok, terapkan kebijakan fallback atau 406 yang terdokumentasi, catat keputusannya ke log, dan uji cache hit, byte, serta privasi dengan matriks permintaan.

Pembahasan mendalam langkah demi langkah

1. Tentukan representasi dan dimensi negosiasi

Perlakukan satu URI sebagai resource dengan representasi seperti HTML versus JSON, bahasa Mandarin versus bahasa Inggris, atau gzip versus br. Sertakan hanya field permintaan yang mengubah byte respons atau semantik; jangan menambahkan setiap cookie atau User-Agent lengkap hanya demi kemudahan. Catat pemilihannya sehingga input yang dinormalisasi dan identik menghasilkan representasi yang sama.

2. Rancang bobot, fallback, dan error

Parse quality factor dan wildcard dalam keluarga Accept serta tentukan daftar yang didukung server beserta prioritasnya. Bahasa dapat melakukan fallback dari wilayah ke bahasa dasar lalu ke default; tipe media dapat memiliki default eksplisit. Kembalikan 406 hanya ketika kontrak mengharuskan penolakan setiap representasi yang tidak dapat diterima. Pilih kompresi hanya dari allowlist dan jangan pernah biarkan nilai yang tidak dikenal mem-bypass-nya.

3. Buat varian cache dapat dihitung

Cantumkan header pemilihan dalam Vary, misalnya Accept, Accept-Language, Accept-Encoding. Bangun variant key dari URI, method, dan nilai yang dinormalisasi dari field-field tersebut; normalisasi mencakup huruf besar/kecil, spasi, dan urutan sehingga variasi penulisan yang setara tidak menciptakan key yang tak terbatas. Jika otorisasi, status sesi, atau cookie pengguna memengaruhi respons, gunakan private cache atau cegah pembagian secara eksplisit.

4. Kontrol hit rate, privasi, dan jumlah varian

Setiap dimensi memecah cache dan menurunkan hit rate. Accept-Language juga dapat menjadi sinyal browser-fingerprinting. Halaman publik dapat memetakan bahasa long-tail ke kumpulan terbatas yang didukung; data yang dipersonalisasi menggunakan private caching, masa berlaku singkat, atau tanpa caching. Jangan gunakan Vary: * untuk menyembunyikan dependensi yang tidak diketahui karena ini mencegah penggunaan kembali pada shared cache.

5. Rancang observabilitas dan verifikasi

Catat input negosiasi yang dinormalisasi, representasi yang dipilih, Vary, status cache, dan alasan fallback ke log tanpa merekam seluruh cookie sensitif. Uji header setiap varian, dekompresi, perilaku hit dan miss CDN, dan terutama urutan "Bahasa Mandarin pertama, Bahasa Inggris kedua." Selama insiden, bandingkan Age, status cache, header Content-*, dan byte aktual, lalu putar ulang matriks permintaan tetap.

Contoh jawaban yang kuat

Saya akan menghitung set representasi yang terbatas dan memilih secara deterministik dari quality factor di Accept, Accept-Language, dan Accept-Encoding. Respons mengembalikan Content-Type, Content-Language, Content-Encoding, dan Vary yang akurat; cache key hanya berisi dimensi yang dinormalisasi tersebut. Otorisasi, status sesi, dan karakteristik berkardinalitas tinggi tetap berada di luar shared cache, sementara bahasa publik long-tail melakukan fallback ke default. Jika tidak ada yang dapat diterima, kontrak memilih 406 atau default eksplisit. Log mencatat pilihan, fallback, dan status hit tanpa cookie sensitif, dan matriks seperti "Mandarin lalu Inggris, br lalu gzip" membuktikan bahwa CDN tidak pernah menggunakan kembali varian yang salah.

Kesalahan umum

  • Menyetel Content-Language tetapi menghilangkan Vary untuk field permintaan yang mengubah respons.
  • Memasukkan cookie lengkap, User-Agent, atau header arbitrer ke dalam cache key dan menghancurkan hit rate.
  • Mengembalikan 406 untuk setiap bahasa yang tidak didukung tanpa fallback wilayah, bahasa dasar, dan default.
  • Membiarkan shared cache menggunakan kembali respons yang bergantung pada Authorization atau data sesi.
  • Mengabaikan negosiasi encoding dan mengembalikan Content-Encoding yang tidak dapat didekode oleh klien.
  • Hanya melihat status code alih-alih memeriksa header Content-*, status cache, dan byte aktual.

Pertanyaan lanjutan dan jawaban

Mengapa Vary tidak boleh hanya berisi Accept-Language?

Jika tipe media atau kompresi juga mengubah respons, cache juga memerlukan dimensi tersebut. Menghilangkannya memungkinkan shared cache mengirimkan representasi yang tidak kompatibel, menyebabkan konten tercampur atau kegagalan decoding.

Kapan Vary: * berguna?

Header ini menyatakan bahwa pemilihan bergantung pada informasi yang tidak tercantum dan biasanya mencegah penggunaan kembali pada shared cache. Ini dapat menjadi perlindungan konservatif, tetapi tidak boleh menggantikan pelacakan dependensi sebenarnya dan pemilihan private caching.

Bagaimana cara mencegah ledakan key Accept-Language?

Petakan bahasa klien ke set terbatas yang didukung, lakukan fallback berdasarkan wilayah, bahasa dasar, dan default. Jika sesuai, gunakan URL eksplisit atau pilihan pengguna untuk menimpa negosiasi otomatis dan pantau hit rate per varian.

Haruskah kegagalan negosiasi mengembalikan 406 atau representasi default?

Kontrak antarmuka yang menentukannya. Machine API sering kali memerlukan error eksplisit, sedangkan halaman web dapat melakukan fallback ke bahasa atau tipe media default. Dokumentasikan dan catat aturan yang sama di log; jangan secara diam-diam mengembalikan representasi dengan semantik yang salah.

Sumber publik

Pertanyaan terkait