Masalah dan cakupan
Platform ini menerima 10 juta gambar asli per hari, sementara klien meminta berbagai dimensi, pemotongan, dan format keluaran. Desain penyimpanan gambar asli, tugas transformasi, caching gambar turunan, dan pengiriman CDN. Gambar asli harus dapat diproses ulang; lapisan pengeditan kolaboratif, model moderasi konten, dan kalibrasi warna profesional berada di luar cakupan. Angka-angka ini adalah asumsi wawancara, bukan tolok ukur industri.
Hal yang dievaluasi pewawancara
Memisahkan identitas gambar asli, permintaan transformasi, dan aset turunan. Menjelaskan bagaimana pemrosesan asinkron berdampingan dengan pembacaan berlatensi rendah. Jawaban yang kuat mencakup kunci cache deterministik, penggabungan tugas duplikat (duplicate-job coalescing), backpressure antrean, bom piksel dan dekompresi, otorisasi objek, negosiasi konten, dan pembersihan setelah penghapusan.
Pertanyaan klarifikasi
- Apakah dimensi, pemotongan, dan filter arbitrer diizinkan? Berapa batas piksel, ukuran file, dan waktu?
- Format, tingkat kualitas, ruang warna, dan perilaku animasi apa yang diperlukan?
- Haruskah permintaan pertama bersifat sinkron, atau bolehkah mengembalikan
202beserta status tugas? - Apa saja persyaratan retensi, isolasi penyewa (tenant isolation), dan lintas wilayah?
- Apakah hasilnya bersifat publik, atau setiap URL harus membawa otorisasi?
Kerangka jawaban 30 detik
"Saya akan menyimpan gambar asli sebagai aset yang tidak dapat diubah (immutable) yang dialamatkan berdasarkan konten dan mengodekan parameter transformasi yang telah dinormalisasi ke dalam kunci turunan. Pembacaan memeriksa CDN dan objek turunan terlebih dahulu; jika miss, sistem akan mengirimkan tugas idempoten yang dipartisi berdasarkan penyewa dan gambar asli. Worker berjalan di dalam sandbox dengan batas piksel, memori, CPU, dekompresi, dan keluaran, lalu memublikasikan objek sementara yang telah divalidasi secara atomik. Percobaan ulang membawa versi prosesor dan anggaran, sementara permintaan yang identik berbagi satu tugas. Lapisan akses menerapkan URL bertanda tangan, negosiasi, dan kontrol cache; peristiwa penghapusan membersihkan indeks turunan dan entri CDN."
Desain mendalam langkah demi langkah
API pengunggahan mengautentikasi, memverifikasi digest, dan menulis objek asli. Metadata mencatat asset_id, penyewa, hash konten, jenis media, dimensi, jumlah frame, informasi warna, status pemindaian, dan kebijakan retensi. Deduplikasi konten tidak pernah menggantikan pemeriksaan otorisasi penyewa. Validasi magic byte dan kemampuan dekode alih-alih memercayai nama file atau Content-Type.
Normalisasi parameter transformasi seperti batas dimensi, koordinat pemotongan, algoritma resampling, kualitas, rotasi, latar belakang, dan format keluaran ke dalam urutan yang stabil. Kunci turunan dapat berupa hash(original_bytes, normalized_transform, processor_version). Peningkatan prosesor mengubah versi, sehingga algoritma lama dan baru tidak saling menimpa secara diam-diam. Tolak nilai negatif, NaN, rasio ekstrem, dan filter rekursif.
Jalur baca memeriksa CDN, indeks objek turunan, dan tabel deduplikasi tugas. Turunan yang dapat digunakan mengembalikan Cache-Control, ETag, dan tipe konten yang benar. Jika miss, buat tugas PENDING dan kembalikan URL status jika latensi dapat diterima; gambar kecil yang umum dapat menggunakan jalur sinkron yang dibatasi secara ketat. Batasan unik (unique constraint) pada (tenant_id, derived_key) memungkinkan permintaan yang identik berbagi pemrosesan.
Partisi antrean berdasarkan penyewa dan hash gambar asli, serta jadwalkan berdasarkan biaya piksel alih-alih jumlah permintaan. Kuota penyewa, konkurensi global, dan antrean prioritas memberikan backpressure; satu gambar besar tidak dapat memonopoli semua worker. Tugas membawa lease dan versi prosesor, sehingga worker yang terhenti dapat dicoba ulang. Exponential backoff digunakan untuk kegagalan yang dapat dipulihkan; parameter yang tidak valid dan format yang tidak didukung akan langsung digagalkan secara eksplisit.
Sandbox pemrosesan membatasi CPU, memori, disk sementara, rasio dekompresi, jumlah frame, dan dimensi keluaran, serta tidak dapat mengakses jaringan internal. Hitung ulang piksel dan frame aktual setelah mendekode untuk menghentikan bom dekompresi. Tulis objek sementara, validasi digest, dimensi, dan format, lalu publikasikan secara atomik melalui penulisan bersyarat atau berversi. Tentukan kebijakan eksplisit untuk SVG, profil ICC, dan metadata untuk mencegah skrip, path traversal, dan kebocoran privasi.
Cache turunan berdasarkan kuncinya. Penghapusan gambar asli atau perubahan izin memancarkan peristiwa aset yang membatalkan indeks turunan dan CDN. Aset privat menggunakan URL bertanda tangan berumur pendek yang tanda tangannya mencakup penyewa, kunci turunan, kedaluwarsa, dan header respons yang diizinkan. Batasi Vary hanya pada dimensi negosiasi yang benar-benar mengubah keluaran; parameter kueri arbitrer tidak boleh membuat varian cache tanpa batas.
Pantau keberhasilan penulisan gambar asli, usia antrean, throughput berbobot piksel, tingkat hit cache, penggabungan tugas duplikat, latensi transformasi p95, kelas kegagalan, lonjakan sandbox, pertumbuhan turunan, dan 5xx CDN. Rekonsiliasi membandingkan metadata gambar asli, status akhir tugas, indeks turunan, dan daftar objek untuk menghapus objek tanpa induk (orphan). Uji dengan penghentian worker paksa, timeout penyimpanan objek, pesan duplikat, peningkatan versi prosesor, kegagalan pembatalan CDN, dan habisnya kuota penyewa.
Contoh jawaban berkualitas tinggi
"Saya akan memperlakukan gambar asli sebagai aset yang tidak dapat diubah dan dapat dialamatkan, serta menggabungkan parameter yang dinormalisasi dengan versi prosesor ke dalam kunci turunan. Permintaan memeriksa CDN dan objek turunan; jika miss, sistem membuat tugas bersama di bawah batasan unik dan mengembalikan tugas yang sudah ada atau URL status. Antrean dijadwalkan berdasarkan penyewa dan biaya piksel. Worker berjalan di dalam sandbox yang membatasi rasio dekompresi, memori, CPU, frame, dan ukuran keluaran, lalu memvalidasi dan memublikasikan hasil sementara secara atomik.
Akses privat menggunakan URL bertanda tangan yang mencakup penyewa, kunci turunan, dan waktu kedaluwarsa; respons publik menetapkan ETag, Cache-Control, dan tipe konten yang benar. Peristiwa penghapusan membersihkan indeks dan entri CDN. Metrik mencakup rasio hit, usia antrean, latensi p95, lonjakan sumber daya, dan kelas kegagalan; rekonsiliasi menemukan objek yatim. Permintaan yang identik tidak dihitung ulang, gambar berbahaya tidak dapat menghabiskan kapasitas, dan peningkatan prosesor tidak dapat mencemari turunan lama."
Kesalahan umum
- Menggunakan nama file sebagai identitas → penggantian nama dan tabrakan akan menimpa aset → gunakan hash konten dan ID aset.
- Menggabungkan parameter mentah begitu saja → permintaan yang ekuivalen memecah cache → normalisasi sebelum membuat kunci.
- Membuat tugas untuk setiap miss → gambar populer memicu badai komputasi → gabungkan berdasarkan penyewa dan kunci turunan.
- Hanya membatasi ukuran byte → bom dekompresi membengkak menjadi piksel yang sangat besar → batasi piksel yang didekode, frame, dan rasio.
- Memproses setiap permintaan secara sinkron → pekerjaan yang lambat memblokir pembacaan → gabungkan antrean asinkron dengan jalur cepat yang terikat batas.
- Menulis langsung ke objek akhir → klien dapat membaca keluaran parsial → validasi objek sementara dan publikasikan secara atomik.
- Hanya menandatangani URL → parameter atau kebijakan respons dapat berubah → tanda tangani penyewa, kunci, kedaluwarsa, dan kebijakan.
- Hanya menghapus gambar asli → turunan privat tetap dapat diakses → jalankan pembersihan dari peristiwa aset.
Pertanyaan lanjutan dan jawaban
Pertanyaan lanjutan 1: Mengapa menyertakan versi prosesor dalam kunci cache?
Algoritma atau pustaka yang berbeda dapat menghasilkan byte yang berbeda. Pemversian memungkinkan hasil baru berdampingan dan hasil lama dihentikan secara terencana.
Pertanyaan lanjutan 2: Bagaimana Anda menangani gambar animasi?
Sertakan jumlah frame, durasi, dan kebijakan keluaran dalam model biaya, batasi total frame dan piksel, serta gunakan kunci terpisah untuk gambar mini (thumbnail) frame pertama.
Pertanyaan lanjutan 3: Kapan Anda mengembalikan 202?
Kembalikan 202, ID tugas, dan panduan percobaan ulang ketika biaya tidak dapat diprediksi, keluaran berukuran besar, atau antrean menumpuk. Format umum berukuran kecil dapat menggunakan anggaran sinkron yang ketat.
Pertanyaan lanjutan 4: Bagaimana cara mencegah keracunan cache (cache poisoning)?
Hanya server yang membuat kunci dari parameter yang dinormalisasi. Validasi tipe, panjang, dan digest sebelum publikasi; ikat cache privat ke otorisasi penyewa.
Pertanyaan lanjutan 5: Apa yang terjadi pada URL lama setelah mengganti gambar asli?
Gunakan ID versi yang tidak dapat diubah. Penggantian membuat aset baru atau peristiwa versi; turunan lama tetap ada atau kedaluwarsa sesuai retensi alih-alih mengubah byte secara diam-diam.
Pertanyaan lanjutan 6: Bagaimana Anda menjaga biaya tetap adil?
Kenakan biaya berdasarkan piksel yang didekode, piksel keluaran, dan kompleksitas filter. Token bucket penyewa, batas konkurensi, dan anggaran harian mengontrol pemrosesan yang mahal serta menghasilkan respons kuota yang dapat diaudit.