Perintah dan konteks
Klien perlu mengunggah file berukuran beberapa gigabita melalui jaringan yang tidak stabil. Klien seluler dapat mencoba kembali (retry) atau mengirimkan bagian yang sama secara bersamaan. Layanan harus menampilkan kemajuan, memungkinkan bagian yang hilang untuk dicoba kembali, dan membuktikan integritas konten sebelum dan sesudah finalisasi. Wawancara ini berfokus pada status protokol, idempotensi, checksum, siklus hidup, dan visibilitas objek.
Apa yang sedang diuji oleh pewawancara
Pewawancara ingin melihat permintaan besar didekomposisi menjadi sesi yang dapat dipulihkan. Google Cloud mendefinisikan unggahan yang dapat dilanjutkan sebagai beberapa permintaan yang dapat dilanjutkan setelah terjadi kegagalan komunikasi; unggahan multipart Amazon S3 memerlukan bagian terlebih dahulu dan panggilan penyelesaian eksplisit sebelum menyusun objek, serta merekomendasikan pembersihan siklus hidup untuk unggahan yang belum selesai. Jawaban yang kuat juga mencakup otorisasi, batas laju (rate limits), dan semantik penyelesaian duplikat.
Pertanyaan klarifikasi untuk diajukan terlebih dahulu
Klarifikasi ukuran objek, ukuran bagian, dan batas konkurensi; apakah klien dapat menyimpan URL sesi; apakah objek dapat ditimpa atau dibuat versinya; apakah klien menyediakan digest seluruh file atau layanan yang menghitungnya; serta kebijakan retensi sesi, pembatalan, penyalahgunaan, dan kuota penyewa (tenant). Presigned URL tidak secara otomatis membawa otorisasi bisnis.
Kerangka jawaban 30 detik
Katakan: “Saya akan menyediakan operasi pembuatan sesi (create-session), unggah bagian (upload-part), status, penyelesaian (complete), dan pembatalan (cancel). Sesi mengikat penyewa, kunci objek, ukuran, aturan bagian, kedaluwarsa, dan kebijakan checksum. Setiap bagian bersifat idempoten berdasarkan (uploadId, partNumber, checksum). Penyelesaian memverifikasi bagian-bagian yang berurutan dan digest seluruh objek, kemudian menerbitkan versi objek secara atomik. Sebuah worker membersihkan sesi yang kedaluwarsa; otorisasi, kuota, dan batas laju diperiksa saat pembuatan dan pada setiap permintaan bagian.”
Analisis mendalam langkah demi langkah
1. Buat dan otorisasi sesi unggahan
POST /uploads memeriksa kuota penyewa, ukuran objek, tipe konten, dan izin tujuan, kemudian mengembalikan uploadId acak, ukuran bagian, masa kedaluwarsa, dan kredensial unggahan yang dibatasi cakupannya. Sesi mencatat ukuran yang diharapkan, kunci objek, kebijakan versi, dan algoritma checksum; klien tidak dapat memilih jalur penyimpanan arbitrer.
2. Rancang bagian yang idempoten dan status
PUT /uploads/{id}/parts/{n} membawa panjang bagian dan checksum. Layanan menyimpan metadata valid terbaru untuk uploadId + partNumber; duplikat dengan digest yang sama mengembalikan respons sukses, sedangkan digest yang berbeda mengembalikan konflik dan meminta klien untuk menyegarkan status. GET /uploads/{id} mengembalikan bagian yang telah dikonfirmasi, ukuran, dan tindakan selanjutnya tanpa mengekspos data penyewa lain.
3. Verifikasi integritas data
Validasi panjang dan checksum bagian pada setiap unggahan, kemudian validasi nomor bagian yang berurutan, panjang total, dan digest seluruh objek saat penyelesaian. Amazon S3 mendokumentasikan checksum bagian atau komposit; ketidakcocokan harus mencegah publikasi. Simpan algoritma dan encoding dalam sesi agar klien dan layanan tidak menafsirkan digest secara berbeda.
4. Selesaikan dan kendalikan visibilitas
POST /uploads/{id}/complete membawa daftar bagian yang terurut dan digest seluruh file opsional. Penyelesaian bersifat idempoten: daftar yang sama mengembalikan versi objek yang sama, sedangkan daftar yang berkonflik akan ditolak. Hanya setelah penyimpanan menyusun dan memverifikasi objek, barulah catatan basis data berpindah dari UPLOADING ke READY; operasi baca tidak pernah mengekspos objek parsial.
5. Batalkan, kedaluwarsa, dan bersihkan bagian yatim
Klien dapat membatalkan secara eksplisit. Sebuah worker memindai sesi yang kedaluwarsa, memanggil operasi pembatalan penyimpanan, dan menghapus bagian yang telah diunggah. Pembersihan itu sendiri bersifat idempoten dan dapat dicoba kembali, dengan metrik kesalahan terakhir dan biaya yang dicatat. S3 mencatat bahwa bagian yang tidak lengkap dikenakan biaya penyimpanan, sehingga aturan siklus hidup adalah jaring pengaman terakhir, bukan pengganti status aplikasi.
6. Tambahkan keamanan, kuota, dan observabilitas
Setiap operasi memeriksa penyewa, izin objek, status sesi, dan rentang bagian. Kredensial dibatasi pada sesi saat ini dan cepat kedaluwarsa. Batasi sesi aktif, total byte, dan ukuran bagian per penyewa. Pantau keberhasilan sesi, percobaan ulang, kegagalan checksum, penundaan pembersihan, dan byte yatim, dengan peringatan yang terisolasi per penyewa.
Contoh jawaban berkualitas tinggi
“Saya akan membuat sesi dengan POST /uploads, memvalidasi kuota penyewa dan ukuran objek, serta menerbitkan uploadId acak, ukuran bagian tetap, algoritma checksum, dan kedaluwarsa 24 jam. Setiap bagian membawa nomor, panjang, dan digest-nya; (uploadId, partNumber) adalah kunci idempotensi. Duplikat dengan digest yang sama mengembalikan hasil yang ada, sedangkan digest yang berbeda ditolak. Klien menggunakan endpoint status untuk menemukan bagian yang hilang. Penyelesaian menyediakan daftar terurut dan digest seluruh file; layanan memverifikasi penomoran, panjang total, dan checksum bagian, lalu memanggil operasi penyelesaian penyimpanan objek. Hanya setelah perakitan berhasil, layanan menandai objek sebagai READY. Penyelesaian berulang mengembalikan versi yang sama; daftar yang berkonflik tidak mengubah apa pun. Worker pembatalan dan kedaluwarsa membatalkan unggahan yang belum selesai dengan percobaan ulang, menghindari biaya penyimpanan yatim. Kredensial dicakup berdasarkan penyewa dan sesi, serta jalur pembuatan, bagian, dan penyelesaian semuanya menegakkan kuota, otorisasi, batas laju, dan audit.”
Kesalahan umum dan perbaikan
- Menjadikan unggahan sebagai satu permintaan panjang: Gunakan sesi dan bagian-bagian sehingga kegagalan jaringan hanya memengaruhi data yang hilang.
- Hanya melacak byte yang diunggah: Lacak nomor bagian, digest, dan versi untuk mencegah penggantian duplikat atau yang tidak berurutan.
- Menandai sukses sebelum penyelesaian: Susun dan verifikasi di penyimpanan terlebih dahulu, kemudian publikasikan objek
READY. - Mengabaikan biaya bagian yang kedaluwarsa: Sediakan pembatalan, penghentian latar belakang, dan pembersihan siklus hidup penyimpanan secara bersamaan.
Pertanyaan lanjutan dan tanggapan
Bagaimana jika klien mengunggah bagian yang sama secara bersamaan?
Serialisasikan pembaruan metadata berdasarkan sesi dan nomor bagian atau gunakan penulisan bersyarat (conditional write). Duplikat dengan digest yang sama mengembalikan sukses idempoten; digest yang berbeda mengembalikan konflik, dan klien menyegarkan status sebelum mencoba kembali.
Bagaimana jika penyelesaian mengalami batas waktu (timeout) setelah penyimpanan sebenarnya selesai?
Pertahankan kunci idempotensi penyelesaian dan versi target. Pada percobaan ulang, lakukan kueri pada penyimpanan dan status lokal terlebih dahulu. Jika daftar cocok dengan versi yang telah selesai, kembalikan versi tersebut; jika tidak yakin, pertahankan COMPLETING dan biarkan worker merekonsiliasi daripada menyusun secara membabi buta.
Bagaimana cara menghentikan klien yang menyalahgunakan sistem agar tidak memenuhi penyimpanan?
Reservasikan kuota saat pembuatan sesi dan batasi sesi aktif, total byte bagian, konkurensi, serta masa kedaluwarsa per penyewa. Ikat kredensial bagian ke sesi dan rentang, batalkan sesi yang kedaluwarsa dengan segera, dan berikan peringatan pada tingkat percobaan ulang yang tidak normal.
Haruskah objek dengan kunci yang sama dapat ditimpa?
Gunakan versi baru atau penulisan bersyarat secara default. Jika penimpaan diperlukan, terima versi target atau kondisi If-Match dan perbarui referensi secara atomik setelah selesai, sehingga unggahan yang lambat tidak dapat menimpa objek yang lebih baru.