Topik temu duga representatif

Temu Duga Backend: Mereka Bentuk API Eksport Data Pukal dengan Titik Semak (Checkpoints)

BackendSukar
Pasukan Editorial Offer.ccDiterbitkan Dikemas kini

Soalan

Reka bentuk API yang membolehkan penyewa (tenant) mengeksport ratusan juta rekod. Eksport mungkin berjalan selama berjam-jam, klien melakukan pengundian (polling) dan mencuba semula selepas terputus sambungan, dan data berubah semasa proses berjalan; hasil mestilah boleh dihasilkan semula tanpa duplikasi atau jurang data di samping melindungi sistem dalam talian.

Keperluan dan skop

Produk B2B memerlukan eksport penuh dan bertambah (incremental). Satu proses eksport boleh melebihi had masa tamat permintaan (timeout) dan had fail tunggal, dan klien mungkin mencuba semula selepas muat turun terputus. Temu duga ini menguji sempadan eksport, keadaan tak segerak, titik semak, keterlihatan fail, pengesahan kebenaran, dan kuota sumber.

Perkara yang diuji oleh penemu duga

Penemu duga ingin melihat sama ada anda boleh mengubah tugas yang panjang menjadi protokol yang boleh diperhatikan (observable) dan boleh disambung semula (resumable). Data Portability API milik Google menganggap eksport sebagai keupayaan khusus dan memerlukan semakan untuk skop sensitif; eksport bertambah Zendesk menyimpan kursor atau sempadan masa untuk titik permulaan seterusnya dan secara jelas mengelakkan perlumbaan penulisan baru-baru ini (recent-write race); Oracle FHIR Bulk Export mendedahkan lokasi tugas untuk tujuan pengundian. Jawapan yang mantap juga menyatakan ketekalan snapshot, semantik pemadaman, dan pengasingan penyewa.

Soalan untuk dijelaskan terlebih dahulu

Sahkan sumber, mod penuh berbanding bertambah, baris maksimum dan pengekalan; sama ada ketekalan rentas jadual diperlukan; sama ada output adalah JSONL, CSV, atau shard termampat; sama ada klien memerlukan pembatalan dan muat turun julat (range downloads); siapa yang boleh mencipta dan memuat turun; serta belanjawan keserentakan, lebar jalur, dan storan bagi setiap penyewa. Jangan anggap "eksport selesai" dan "fail dimuat turun" sebagai satu keadaan yang sama.

Rangka jawapan 30 saat

Mulakan dengan: "Saya akan mendedahkan operasi cipta, status, manifes/muat turun, dan batal. Penciptaan menetapkan skop pengesahan dan sempadan snapshot serta mengembalikan ID tugas. Pekerja (workers) membaca shard dan mengekalkan titik semak, kemudian menerbitkan manifes fail yang tidak boleh diubah (immutable). Klien mengundi lokasi tugas dan hanya menerima kelayakan muat turun jangka pendek selepas selesai. Titik semak dan kunci kedidaksamaan (idempotency keys) menjadikan percubaan semula pekerja selamat; tamat tempoh membuang fail dan melepaskan kuota. Eksport bertambah menggunakan kursor atau tanda aras tinggi (high-water mark) yang dimeterai dan bukannya sempadan jam yang sentiasa bergerak."

Perincian langkah demi langkah

Langkah 1: Cipta tugas dan bekukan sempadannya

POST /exports mengesahkan kebenaran penyewa, skop sumber, penapis, dan kuota, kemudian mencipta exportId yang tidak dapat diteka. Tugas menyimpan snapshot pengesahan, format, pemampatan, masa penciptaan, tamat tempoh, dan snapshotWatermark. Jika pangkalan data menyokong snapshot yang konsisten, baca tera air (watermark) dalam satu transaksi; jika tidak, nyatakan bahawa ini adalah anggaran snapshot bagi setiap sumber, bukan ketekalan rentas jadual yang ketat.

Langkah 2: Jadikan status dan penciptaan idempoten

Terima Idempotency-Key; penyewa dan kunci yang sama mengembalikan tugas yang sama. GET /exports/{id} melaporkan QUEUED, RUNNING, SUCCEEDED, FAILED, CANCELLED, atau EXPIRED, serta shard yang diproses dan tindakan seterusnya. Mesin keadaan hanya bergerak ke hadapan. Kemas kini bersyarat memutuskan perlumbaan batal-berbanding-selesai, dan percubaan semula tidak boleh mengenakan kuota dua kali.

Langkah 3: Baca shard dan kekalkan titik semak

Pekerja membaca kelompok tetap mengikut kunci utama yang stabil atau kursor snapshot pangkalan data dan menulis objek sementara. Setiap shard merekodkan (exportId, partition, cursor, rowCount, checksum, objectKey); komit titik semak dan metadata shard adalah idempoten. Selepas ranap sistem, pekerja berjalan semula dari kursor terakhir yang dikomitkan. Versi shard deterministik atau penulisan objek bersyarat akan menulis ganti duplikasi, manakala manifes akhir merujuk setiap shard sekali sahaja.

Langkah 4: Tentukan sempadan penuh dan bertambah

Eksport penuh membaca pada atau sebelum snapshotWatermark; sisipan dan kemas kini yang lebih lewat adalah milik larian bertambah yang seterusnya. Larian bertambah bermula dari kursor yang disimpan atau tanda aras tinggi, bukan "sekarang tolak satu saat." Zendesk mendokumentasikan bahawa kursor boleh digunakan semula untuk halaman seterusnya dan eksport seterusnya, dengan kelewatan keselamatan (safety delay) untuk mengelakkan perlumbaan penulisan baru-baru ini. Masukkan kelewatan, pengendalian duplikasi, dan tetingkap pembaikan ke dalam kontrak.

Langkah 5: Terbitkan manifes dan muat turun dengan selamat

Selepas setiap shard selesai dan disahkan, alihkan tugas secara atomik daripada RUNNING kepada SUCCEEDED dan cipta manifes tidak boleh diubah yang mengandungi fail, saiz, checksum, dan julat. Titik akhir muat turun mengembalikan kelayakan yang diskopkan kepada penyewa dan objek untuk jangka hayat yang pendek; ia tidak boleh mengakses laluan sewenang-wenangnya. Muat turun yang gagal akan mendapatkan semula manifes yang sama dan bukannya menjalankan semula eksport. Fail kekal baca sahaja sehingga tamat tempoh.

Langkah 6: Lindungi sumber, batal, dan bersihkan

Penciptaan dan penjadualan menguatkuasakan had bagi setiap penyewa pada tugas serentak, baris yang diimbas, CPU, storan objek, dan aliran keluar data (egress). Tugas yang besar menggunakan baris gilir dan had keserentakan global; permintaan dalam talian menggunakan kolam sumber yang berasingan. Pembatalan menghentikan shard baharu, menandakan tugas, dan memadamkan objek sementara secara tak segerak. Pembersih yang boleh dicuba semula menuntut semula tugas EXPIRED dan merekodkan bait yatim (orphan bytes), sebab kegagalan, dan kelewatan pembersihan. Peristiwa audit merekodkan pelaku, skop, dan muat turun.

Jawapan model berkualiti tinggi

"Saya akan mencipta tugas dengan POST /exports, mengesahkan kebenaran dan kuota penyewa, serta mengekalkan skop, format, tamat tempoh, tera air snapshot, dan kunci kedidaksamaan. Respons hanya mengembalikan exportId; klien mengundi GET /exports/{id}. Pekerja membaca kelompok daripada kursor snapshot, mengekalkan kursor, kiraan baris, dan checksum setiap shard. Percubaan semula diteruskan dari titik semak terakhir yang dikomitkan, dan (exportId, partition, cursor) menjadikan penulisan duplikasi idempoten. Eksport penuh menggunakan satu tera air tetap; eksport bertambah menyimpan kursor atau tanda aras tinggi ditambah kelewatan keselamatan. Selepas semua shard disahkan, manifes tidak boleh diubah diterbitkan dan tugas secara atomik menjadi SUCCEEDED; muat turun menggunakan kelayakan jangka pendek yang terikat dengan penyewa. Pembatalan dan tamat tempoh menghentikan kerja baharu, membuang objek sementara, dan melepaskan kuota. Had kadar, sumber yang diasingkan, dan log audit melindungi trafik dalam talian."

Kesilapan biasa dan penambahbaikan

  • Mengimbas keseluruhan pangkalan data dalam satu permintaan HTTP: Gunakan tugas beratur dan keadaan yang boleh diundi supaya sambungan tidak mengalami had masa tamat.
  • Menggunakan jam semasa sebagai permulaan bertambah: Simpan kursor atau tanda aras tinggi yang dimeterai dan tentukan kelewatan keselamatan serta dasar duplikasi.
  • Mencipta fail baharu pada setiap percubaan semula: Jadikan shard dan manifes idempoten; percubaan semula hanya mengisi kerja yang hilang.
  • Mengeluarkan pautan muat turun kekal: Ikatkan kelayakan kepada penyewa, objek, dan tamat tempoh; muat turun yang gagal akan mendapatkan fail yang sama.

Soalan susulan dan jawapan

Bagaimana jika rekod dipadamkan semasa eksport?

Tentukan semantik produk terlebih dahulu. Eksport snapshot merangkumi rekod yang kelihatan sebelum tera airnya; strim bertambah harus membawa tombstone (penanda padam) atau jenis perubahan. Kekalkan tombstone sehingga tetingkap pembaikan setiap pengguna telah berlalu.

Bagaimana jika pekerja menulis fail dan ranap sebelum mengkomitkan titik semaknya?

Semasa mula semula, percayai titik semak pangkalan data dan jalankan semula kelompok tersebut. Penulisan bersyarat atau versi shard deterministik akan menulis ganti objek dengan selamat, dan manifes hanya menerima shard yang telah dikomit dan disahkan, jadi kerja separa tidak akan boleh dimuat turun.

Bagaimanakah anda menghalang satu penyewa daripada merosakkan pangkalan data dalam talian?

Gunakan replika baca (read replicas), snapshot, atau kolam pertanyaan khusus; hadkan keserentakan imbasan dan baris sesaat. Jadualkan secara adil mengikut penyewa dan pantau kelengahan replika, penantian kunci, dan egress; perlahankan atau jeda eksport yang melepasi ambang.

Bagaimanakah klien boleh menyambung semula muat turun yang terputus?

Pastikan eksport tidak boleh diubah dan sokong muat turun Julat HTTP (HTTP Range) atau berasaskan shard. Klien menyimpan manifes, checksum, dan julat yang telah selesai; memperbaharui kelayakan tidak mengubah versi fail atau menjalankan semula eksport."

Sumber awam

Soalan berkaitan