Perintah dan cakupan
Produk B2B membutuhkan ekspor penuh (full) dan inkremental. Satu proses ekspor dapat melampaui batas waktu permintaan (timeout) dan batas ukuran file tunggal, dan klien dapat mencoba kembali setelah unduhan terputus. Wawancara ini menguji batasan ekspor, status asinkron, checkpoint, visibilitas file, otorisasi, dan kuota sumber daya.
Hal yang diuji oleh pewawancara
Pewawancara ingin melihat apakah Anda dapat mengubah pekerjaan yang panjang menjadi protokol yang dapat diamati (observable) dan dapat dilanjutkan (resumable). Data Portability API milik Google memperlakukan ekspor sebagai kemampuan khusus dan memerlukan peninjauan untuk cakupan sensitif; ekspor inkremental Zendesk menyimpan kursor atau batas waktu untuk titik awal berikutnya dan secara eksplisit menghindari race condition dengan penulisan baru (recent-write race); Oracle FHIR Bulk Export mengekspos lokasi job untuk polling. Jawaban yang kuat juga menyatakan konsistensi snapshot, semantik penghapusan, dan isolasi tenant.
Pertanyaan untuk diklarifikasi terlebih dahulu
Konfirmasikan sumber daya, mode penuh versus inkremental, baris maksimum dan retensi; apakah konsistensi lintas-tabel diperlukan; apakah output berupa JSONL, CSV, atau shard terkompresi; apakah klien memerlukan pembatalan dan pengunduhan sebagian rentang (range download); siapa yang boleh membuat dan mengunduh; serta anggaran konkurensi, bandwidth, dan penyimpanan setiap tenant. Jangan memperlakukan "ekspor selesai" dan "file diunduh" sebagai satu status yang sama.
Kerangka jawaban 30 detik
Buka dengan: "Saya akan mengekspos operasi create, status, manifest/download, dan cancel. Pembuatan menetapkan cakupan otorisasi dan batas snapshot serta mengembalikan ID job. Worker membaca shard dan menyimpan checkpoint, lalu memublikasikan manifes file yang tidak dapat diubah (immutable). Klien melakukan polling ke lokasi job dan hanya menerima kredensial unduhan berumur pendek setelah selesai. Checkpoint dan kunci idempotensi membuat percobaan ulang worker aman; kedaluwarsa menghapus file dan melepaskan kuota. Ekspor inkremental menggunakan kursor atau tanda batas atas (high-water mark) yang disegel alih-alih batas jam yang terus bergerak."
Pembahasan mendalam langkah demi langkah
Langkah 1: Buat job dan bekukan batasannya
POST /exports memvalidasi otorisasi tenant, cakupan sumber daya, filter, dan kuota, lalu membuat exportId yang tidak dapat ditebak. Job menyimpan snapshot otorisasi, format, kompresi, waktu pembuatan, masa kedaluwarsa, dan snapshotWatermark. Jika database mendukung snapshot yang konsisten, baca watermark dalam satu transaksi; jika tidak, nyatakan bahwa ini adalah snapshot perkiraan per sumber daya, bukan konsistensi lintas-tabel yang ketat.
Langkah 2: Buat status dan pembuatan menjadi idempoten
Terima Idempotency-Key; tenant dan kunci yang sama akan mengembalikan job yang sama. GET /exports/{id} melaporkan QUEUED, RUNNING, SUCCEEDED, FAILED, CANCELLED, atau EXPIRED, ditambah shard yang telah diproses dan tindakan berikutnya. State machine hanya bergerak maju. Pembaruan bersyarat menentukan kondisi race antara pembatalan dan penyelesaian, dan percobaan ulang tidak boleh memotong kuota dua kali.
Langkah 3: Baca shard dan simpan checkpoint
Worker membaca batch tetap berdasarkan primary key yang stabil atau kursor snapshot database dan menulis objek sementara. Setiap shard mencatat (exportId, partition, cursor, rowCount, checksum, objectKey); commit checkpoint dan metadata shard bersifat idempoten. Setelah terjadi crash, worker berjalan kembali dari kursor terakhir yang di-commit. Versi shard deterministik atau penulisan objek bersyarat akan menimpa duplikat, sementara manifes akhir mereferensikan setiap shard satu kali saja.
Langkah 4: Tentukan batasan penuh dan inkremental
Ekspor penuh membaca data pada atau sebelum snapshotWatermark; insert dan update yang terjadi setelahnya menjadi bagian dari proses inkremental berikutnya. Proses inkremental dimulai dari kursor atau tanda batas atas yang disimpan, bukan "waktu sekarang dikurangi satu detik." Zendesk mendokumentasikan bahwa kursor dapat digunakan kembali untuk halaman berikutnya dan ekspor berikutnya, dengan jeda pengaman (safety delay) untuk menghindari race condition dengan penulisan baru. Cantumkan jeda waktu, penanganan duplikat, dan jendela perbaikan dalam kontrak.
Langkah 5: Publikasikan manifes dan unduh dengan aman
Setelah setiap shard selesai dan diverifikasi, pindahkan job secara atomik dari RUNNING ke SUCCEEDED dan buat manifes immutable yang berisi daftar file, ukuran, checksum, dan rentang. Endpoint unduhan mengembalikan kredensial yang dibatasi untuk tenant dan objek tersebut dengan masa berlaku singkat; kredensial tidak dapat mengakses jalur sembarangan. Unduhan yang gagal akan mengambil manifes yang sama alih-alih menjalankan ulang ekspor. File tetap bersifat read-only hingga masa kedaluwarsa.
Langkah 6: Lindungi sumber daya, batalkan, dan bersihkan
Pembuatan dan penjadwalan menerapkan batasan per-tenant pada job bersamaan, baris yang dipindai, CPU, penyimpanan objek, dan transfer data keluar (egress). Job berukuran besar menggunakan antrean dan batas konkurensi global; permintaan online menggunakan kumpulan sumber daya terpisah. Pembatalan akan menghentikan shard baru, menandai job, dan menghapus objek sementara secara asinkron. Pembersih yang dapat diulang (retryable cleaner) mereklamasi job EXPIRED dan mencatat byte yatim (orphan bytes), alasan kegagalan, dan keterlambatan pembersihan. Audit event mencatat pelaku (actor), cakupan, dan aktivitas unduhan.
Contoh jawaban berkualitas tinggi
"Saya akan membuat job dengan POST /exports, memvalidasi otorisasi dan kuota tenant, serta menyimpan cakupan, format, masa kedaluwarsa, watermark snapshot, dan kunci idempotensi. Respons hanya mengembalikan exportId; klien melakukan polling ke GET /exports/{id}. Worker membaca batch dari kursor snapshot, menyimpan kursor, jumlah baris, dan checksum dari setiap shard. Percobaan ulang dilanjutkan dari checkpoint terakhir yang di-commit, dan (exportId, partition, cursor) membuat penulisan duplikat menjadi idempoten. Ekspor penuh menggunakan satu watermark tetap; ekspor inkremental menyimpan kursor atau tanda batas atas ditambah jeda pengaman. Setelah semua shard terverifikasi, manifes immutable dipublikasikan dan job secara atomik berubah menjadi SUCCEEDED; pengunduhan menggunakan kredensial berumur pendek yang terikat pada tenant. Pembatalan dan masa kedaluwarsa menghentikan pekerjaan baru, menghapus objek sementara, dan melepaskan kuota. Batas laju permintaan (rate limit), sumber daya yang terisolasi, dan log audit melindungi lalu lintas online."
Kesalahan umum dan perbaikan
- Memindai seluruh database dalam satu permintaan HTTP: Gunakan job berbasis antrean dan status yang dapat di-polling agar koneksi tidak mengalami timeout.
- Menggunakan jam saat ini sebagai awal inkremental: Simpan kursor atau tanda batas atas yang disegel dan tentukan jeda pengaman serta kebijakan duplikasi.
- Membuat file baru pada setiap percobaan ulang: Buat shard dan manifes bersifat idempoten; percobaan ulang hanya menyelesaikan pekerjaan yang belum selesai.
- Menerbitkan tautan unduhan permanen: Ikat kredensial ke tenant, objek, dan masa kedaluwarsa; unduhan yang gagal akan mengambil file yang sama.
Pertanyaan lanjutan dan jawaban
Bagaimana jika sebuah rekaman data dihapus selama proses ekspor?
Tentukan semantik produk terlebih dahulu. Ekspor snapshot mencakup rekaman yang terlihat sebelum batas watermark-nya; aliran inkremental harus menyertakan tombstone atau jenis perubahan. Simpan tombstone hingga jendela perbaikan setiap konsumen telah berlalu.
Bagaimana jika worker menulis file lalu mengalami crash sebelum meng-commit checkpoint-nya?
Saat restart, percayai checkpoint database dan jalankan ulang batch tersebut. Penulisan bersyarat atau versi shard deterministik akan menimpa objek dengan aman, dan manifes hanya menerima shard yang telah di-commit dan diverifikasi, sehingga pekerjaan parsial tidak akan pernah dapat diunduh.
Bagaimana cara mencegah satu tenant mengganggu database online?
Gunakan replika baca (read replica), snapshot, atau pool kueri khusus; batasi konkurensi pemindaian dan jumlah baris per detik. Jadwalkan secara adil per tenant dan pantau lag replika, penantian kunci (lock wait), dan egress; perlambat atau jeda ekspor jika melampaui batas ambang.
Bagaimana cara klien melanjutkan unduhan yang terputus?
Pertahankan ekspor tetap immutable dan dukung pengunduhan HTTP Range atau berbasis shard. Klien menyimpan manifes, checksum, dan rentang yang telah selesai; memperbarui kredensial tidak mengubah versi file atau menjalankan ulang proses ekspor.