Topik wawancara representatif

Wawancara system design: Menerapkan rate limit global lintas wilayah

Desain sistemSulit
Tim Redaksi Offer.ccDipublikasikan Diperbarui

Pertanyaan

Seorang pelanggan memiliki satu kuota API global, tetapi lalu lintas masuk melalui tiga wilayah. Bagaimana Anda akan menerapkan batasan tersebut tanpa penulisan lintas wilayah pada setiap permintaan, dan batasan apa yang dapat Anda berikan selama terjadi kegagalan?

Konteks dan arahan

Satu tenant membeli kuota global sebesar 30.000 permintaan per menit dengan kapasitas burst sebesar 6.000. Lalu lintas memasuki tiga wilayah aktif, dan pengambilan keputusan lintas wilayah pada setiap permintaan akan meleset dari target latensi. Rancang hanya lapisan koordinasi global; asumsikan setiap wilayah telah memiliki token bucket lokal yang berjalan dengan benar.

Jawaban harus mengukur apa yang terjadi ketika permintaan berpindah antarwilayah, ketika suatu wilayah terisolasi (terpartisi), atau ketika koordinator mengalami kegagalan. HTTP 429 dan Retry-After mengomunikasikan penolakan kepada klien, tetapi keduanya tidak menentukan algoritma pembatasan internal.

Hal yang dinilai oleh pewawancara

  • Apakah Anda menyatakan bahwa latensi rendah, ketersediaan saat partisi, dan batas atas global yang tepat tidak dapat diasumsikan secara bersamaan.
  • Apakah kuota tetap terjaga (konservasi kuota) di seluruh sewa (lease), alih-alih diduplikasi ke setiap wilayah.
  • Apakah kapasitas yang tidak terpakai dapat diambil kembali tanpa terjadi pembelanjaan ganda (double spending).
  • Apakah kebijakan kegagalan dan overshoot maksimum dapat diukur.

Pertanyaan klarifikasi yang perlu diajukan

  • Apakah angka global tersebut merupakan batas pelanggaran yang ketat (hard abuse boundary) atau target komersial dengan toleransi kesalahan?
  • Selama partisi jaringan, apakah suatu wilayah harus berhenti ketika masa sewanya habis atau terus berjalan dalam batas darurat (emergency allowance)?
  • Seberapa cepat lalu lintas dapat berpindah, dan seberapa timpang permintaan antarwilayah dapat terjadi?
  • Apakah satu permintaan memiliki biaya satu unit, atau apakah endpoint mengonsumsi biaya berbobot?
  • Apakah pemanfaatan yang kurang optimal (under-utilization) sementara lebih disukai daripada overshoot?

Untuk batasan ketat (hard ceiling), wilayah yang terpartisi hanya boleh menggunakan sewa yang belum kedaluwarsa. Batasan komersial best-effort dapat mengizinkan emergency allowance yang dibatasi secara eksplisit.

Jawaban 30 detik

“Saya akan menggunakan koordinator dengan urutan yang kuat (strongly ordered) untuk mengelola dua sumber daya yang dapat disewakan: laju pengisian ulang global sebesar 500 permintaan per detik dan kapasitas burst global sebesar 6.000. Koordinator ini menyewakan alokasi laju pengisian dan burst berdurasi pendek ke wilayah-wilayah, yang kemudian dikonsumsi melalui token bucket atomik lokal yang ada. Setiap saat, sewa aktif yang tumpang tindih berjumlah total maksimum 500 permintaan per detik dan 6.000 token burst; pembaruan sewa memperbarui parameter tanpa mengisi ulang saldo lokal. Selama pergeseran lalu lintas, alokasi lama harus dikembalikan atau kedaluwarsa sebelum dialokasikan kembali. Wilayah dengan batasan ketat akan berhenti setelah masa sewa kedaluwarsa selama partisi; wilayah best-effort dapat menggunakan emergency allowance terpisah yang jumlah totalnya merupakan batas overshoot yang terdokumentasi.”

Pembahasan mendalam langkah demi langkah

1. Mempertahankan kuota sebagai invarian konservasi

Ubah 30.000 permintaan per menit menjadi laju pengisian ulang kontinu R = 500 req/s, dengan kapasitas burst B = 6000. Setiap saat, sum(active_lease.refill_rate) <= R dan sum(active_lease.burst_capacity) <= B. Sebuah sewa (lease) memiliki tenant, region, epoch, alokasi laju, alokasi burst, waktu aktivasi, waktu kedaluwarsa, dan ID unik. Saldo awal wilayah berjumlah maksimum B, dan pembaruan, ekspansi, atau rekonfigurasi tidak dapat menciptakan saldo dari ketiadaan; oleh karena itu, total izin masuk selama interval apa pun maksimal R × duration + B. Failover menggunakan buku besar sewa (lease ledger) yang persisten dan epoch yang lebih tinggi; sewa yang ada tetap diperhitungkan dalam kedua batas hingga pengembaliannya dikonfirmasi atau kedaluwarsa.

2. Konsumsi secara lokal dan perbarui sebelum habis

Bucket wilayah mengisi ulang pada laju yang disewa dan membatasi saldonya pada alokasi burst yang disewa; setiap permintaan tetap mengurangi saldo secara atomik. Pembaruan yang tidak terputus memperpanjang atau mengubah laju dan kapasitas sambil mempertahankan saldo yang ada, memotongnya jika kapasitas menurun alih-alih mengisi ulang bucket kembali. Setelah terjadi jeda sewa (lease gap), sewa berikutnya dimulai dari saldo nol kecuali koordinator mentransfer token reklamasi yang telah dikonfirmasi. Sewa yang lebih pendek mempercepat penyeimbangan ulang dan memperketat batas kegagalan, tetapi meningkatkan beban pembaruan. Tentukan durasi berdasarkan lonjakan yang terukur, kapasitas koordinator, dan waktu diskoneksi yang dapat ditoleransi.

3. Rebalance tanpa pembelanjaan ganda (double spending)

Wilayah yang sehat melaporkan saldo dan permintaan. Koordinator mengurangi alokasi laju dan burst pada wilayah dingin dalam sewa berikutnya, lalu memberikan alokasi yang dilepaskan tersebut ke wilayah panas. Hingga sewa lama dikonfirmasi telah dikembalikan atau kedaluwarsa, sewa lama dan baru yang tumpang tindih keduanya diperhitungkan dalam dua batas tersebut. Konfirmasi pengembalian terlebih dahulu membatalkan bucket lama; peningkatan kapasitas di wilayah panas tidak menciptakan saldo, yang dimulai dari nol atau hanya menerima token transfer yang telah dikonfirmasi. Pengembalian bersifat idempoten; ketika status tidak pasti, lebih baik terjadi pemanfaatan yang kurang optimal untuk sementara daripada mengalokasikan bagian yang sama dua kali.

4. Buat semantik kegagalan menjadi eksplisit

Dengan batas ketat, suatu wilayah hanya melakukan pengisian ulang selama masa sewanya valid. Jika tidak dapat memperbarui, kedaluwarsa akan membatalkan bucket lokal dan membuang saldo apa pun yang tidak ditransfer melalui pengembalian yang terkonfirmasi; dampaknya adalah under-utilization sementara. Jika setiap wilayah memiliki alokasi darurat E di luar batas burst normal, alokasi tambahan maksimum adalah jumlah anggaran yang dapat aktif saat terputus, dan mode tersebut tidak dapat menjamin nol overshoot secara mutlak. Kegagalan koordinator tidak membatalkan sewa yang telah diterbitkan. Koordinator pengganti memulihkan buku besar persisten, memagari (fence) penerbit lama dengan epoch yang lebih tinggi, dan terus menghitung sewa lama yang belum kedaluwarsa.

Contoh jawaban yang kuat

“Token bucket regional yang ada tetap berada di jalur sinkron. Saya menambahkan koordinator global yang merepresentasikan 30.000 permintaan per menit sebagai laju pengisian ulang 500 permintaan per detik dan mengelola 6.000 permintaan kapasitas burst secara terpisah. Koordinator ini menerbitkan alokasi laju dan burst yang memiliki masa berlaku serta dipagari oleh epoch, sambil memastikan bahwa sewa aktif berjumlah total maksimum 500 permintaan per detik dan 6.000 token burst.

Setiap wilayah mengisi ulang bucket lokalnya pada laju yang disewa dan membatasinya pada alokasi burst yang disewa. Pembaruan tanpa gangguan mempertahankan saldo, dan kapasitas ekstra tidak menghasilkan saldo baru. Wilayah panas hanya menerima token yang telah dikonfirmasi pengembaliannya, atau mulai mengisi ulang dari nol setelah sewa wilayah dingin kedaluwarsa. Di bawah batasan ketat, wilayah yang terisolasi membatalkan bucket-nya setelah sewa kedaluwarsa. Jika bisnis mengizinkan 100 token darurat tambahan per wilayah, overshoot partisi yang terdokumentasi maksimal adalah jumlah anggaran darurat yang aturan aktivasinya dapat tumpang tindih. Failover memulihkan buku besar sewa dan menggunakan epoch baru. Saya akan menguji pergeseran lalu lintas, pengembalian duplikat, pembaruan yang tumpang tindih, clock skew, dan partisi jaringan terhadap kedua invarian tersebut.”

Kesalahan umum

  • Memberikan laju penuh dan kapasitas burst penuh ke setiap wilayah → batas global berlipat ganda sesuai jumlah wilayah → sewakan alokasi laju dan burst secara terpisah.
  • Menggunakan kembali sewa yang dikembalikan sebelum pengembalian dipastikan → token yang sama dapat terpakai dua kali → buat pengembalian menjadi idempoten atau tunggu hingga kedaluwarsa.
  • Mengatakan “eventual consistency” tanpa batas kesalahan → tidak ada yang mengetahui potensi overshoot yang terjadi → nyatakan batasan sewa dan anggaran darurat secara jelas.
  • Mengisi ulang bucket lokal pada setiap pembaruan → setiap pembaruan menciptakan burst baru → pertahankan saldo dan hanya perbarui laju, kapasitas, serta masa berlaku.
  • Melakukan failover tanpa fencing → dua koordinator dapat menerbitkan kuota yang valid secara bersamaan → sertakan epoch monotonik pada setiap sewa.

Pertanyaan lanjutan dan tanggapan

Bagaimana Anda memilih ukuran sewa?

Pilih durasi, alokasi laju pengisian, dan alokasi burst secara terpisah. Tetapkan durasi berdasarkan toleransi waktu diskoneksi, tentukan laju dari permintaan terkini, dan tentukan burst dari lonjakan dalam batas kapasitas global 6.000. Durasi yang lebih pendek mempercepat penyeimbangan ulang dan memperketat batas kegagalan, tetapi meningkatkan beban pembaruan.

Apa yang terjadi jika lalu lintas tiba-tiba berpindah wilayah?

Koordinator mengurangi alokasi laju dan burst pada wilayah dingin pada sewa berikutnya, lalu mentransfer alokasi yang dilepaskan setelah pengembalian dikonfirmasi atau sewa lama kedaluwarsa. Sistem mungkin menolak sementara meskipun ada kapasitas yang tidak terpakai saat menunggu; itulah kompensasi untuk mencegah alokasi berlebih yang tumpang tindih.

Bagaimana Anda mengembalikan Retry-After?

Gunakan waktu paling awal antara pengisian ulang lokal berikutnya di bawah sewa saat ini, aktivasi sewa baru yang terkonfirmasi, atau estimasi pemulihan koordinator, yang dibulatkan ke presisi yang didukung respons. Jangan menjanjikan waktu jika pemulihan tidak diketahui; kembalikan kebijakan percobaan ulang (retry policy) yang terbatas sebagai gantinya.

Bisakah desain ini menjamin zero overshoot dan ketersediaan partisi penuh?

Hanya jika setiap partisi telah memegang kuota pra-alokasi yang cukup (yang dapat menyebabkan kapasitas terdampar), atau jika permintaan berkoordinasi secara sinkron lintas wilayah (yang mengorbankan latensi dan ketersediaan partisi). Jawaban harus menentukan batasan produk secara eksplisit.

Sumber publik

Pertanyaan terkait

Alat wawancara terkait

Gunakan Jawab untuk jawaban desain sistem

Perjelas persyaratan terlebih dahulu, lalu lanjutkan dengan skala, arsitektur, pilihan komponen, dan trade-off.

Lihat alat