Gesaan dan konteks
Satu penyewa membeli peruntukan global sebanyak 30,000 permintaan seminit dengan kapasiti lonjakan (burst capacity) sebanyak 6,000. Trafik memasuki tiga wilayah aktif, dan keputusan merentas wilayah pada setiap permintaan akan gagal mencapai objektif kependaman (latency). Reka lapisan penyelarasan global sahaja; anggap setiap wilayah sudah mempunyai token bucket tempatan yang betul.
Jawapan mesti mengukur secara kuantitatif apa yang berlaku apabila permintaan beralih antara wilayah, wilayah terpisah (partitioned), atau penyelaras gagal. HTTP 429 dan Retry-After menyampaikan penolakan kepada klien, tetapi ia tidak menentukan algoritma pengehadan dalaman.
Perkara yang dinilai oleh penemu duga
- Sama ada anda menyatakan bahawa kependaman rendah, ketersediaan semasa pemisahan rangkaian, dan had siling global yang tepat tidak boleh diandaikan wujud serentak.
- Sama ada kuota dipelihara merentas pajakan dan bukannya disalin ke setiap wilayah.
- Sama ada kapasiti yang tidak digunakan boleh dituntut semula tanpa perbelanjaan berganda (double spending).
- Sama ada dasar kegagalan dan lebihan had maksimum boleh diukur.
Soalan penjelasan untuk ditanya
- Adakah angka global tersebut merupakan had ketat pencegahan salah guna atau sasaran komersial dengan ralat yang dibenarkan?
- Semasa pemisahan rangkaian, patutkah sesuatu wilayah berhenti apabila pajakannya kosong atau meneruskan operasi dalam peruntukan kecemasan?
- Seberapa cepat trafik boleh beralih, dan sejauh mana permintaan serantau boleh menjadi tidak sekata?
- Adakah satu permintaan mempunyai kos unit, atau adakah titik akhir (endpoints) menggunakan kos berpemberat?
- Adakah kurang penggunaan (under-utilization) sementara lebih baik daripada lebihan had?
Bagi had siling ketat, wilayah yang terpisah hanya boleh menggunakan pajakannya yang belum tamat tempoh. Had komersial usaha terbaik (best-effort) mungkin membenarkan peruntukan kecemasan yang dibatasi secara eksplisit.
Jawapan 30 saat
“Saya akan menggunakan penyelaras dengan susunan ketat (strongly ordered coordinator) untuk mengurus dua sumber yang boleh dipajak: kadar pengisian semula global sebanyak 500 permintaan sesaat dan kapasiti lonjakan global sebanyak 6,000. Ia memajakkan bahagian kadar pengisian dan bahagian lonjakan jangka pendek kepada wilayah-wilayah, yang kemudiannya menggunakan kuota melalui token bucket atomik tempatan sedia ada. Pada setiap masa, jumlah pajakan aktif yang bertindih adalah maksimum 500 permintaan sesaat dan 6,000 token lonjakan; pembaharuan mengemas kini parameter tanpa mengisi semula baki tempatan. Semasa peralihan trafik, bahagian lama mesti dikembalikan atau tamat tempoh sebelum diperuntukkan semula. Wilayah had ketat akan berhenti selepas tamat tempoh pajakan semasa pemisahan rangkaian; wilayah usaha terbaik boleh menggunakan peruntukan kecemasan berasingan yang jumlahnya merupakan batas lebihan had yang didokumenkan.”
Analisis mendalam langkah demi langkah
1. Memelihara kuota sebagai invarian pemuliharaan
Tukarkan 30,000 permintaan seminit kepada kadar pengisian semula berterusan R = 500 req/s, dengan kapasiti lonjakan B = 6000. Pada setiap masa, sum(active_lease.refill_rate) <= R dan sum(active_lease.burst_capacity) <= B. Sesuatu pajakan mempunyai penyewa, wilayah, epok (epoch), bahagian kadar, bahagian lonjakan, masa pengaktifan, masa tamat, dan ID unik. Baki wilayah permulaan berjumlah paling banyak B, dan pembaharuan, peluasan, atau konfigurasi semula tidak boleh mencipta baki daripada tiada apa-apa; oleh itu, jumlah kemasukan dalam mana-mana selang adalah paling banyak R × duration + B. Failover menggunakan lejar pajakan yang tahan lama (durable) dan epok yang lebih tinggi; pajakan sedia ada dikira terhadap kedua-dua had sehingga pengembalian disahkan atau tamat tempoh.
2. Guna secara tempatan dan perbaharui sebelum kehabisan
Bucket wilayah mengisi semula pada kadar yang dipajak dan mengehadkan bakinya pada bahagian lonjakan yang dipajak; setiap permintaan masih mengurangkan baki secara atomik. Pembaharuan tanpa gangguan melanjutkan atau mengubah kadar dan kapasiti sambil mengekalkan baki sedia ada, memotong baki apabila kapasiti berkurang dan bukannya mengisi semula bucket. Selepas jurang pajakan berlaku, pajakan seterusnya bermula dengan baki sifar melainkan penyelaras memindahkan token tuntutan semula yang disahkan. Pajakan yang lebih pendek mengetatkan pengimbangan semula dan batas kegagalan tetapi meningkatkan beban pembaharuan. Pilih tempoh masa berdasarkan puncak yang diukur, kapasiti penyelaras, dan masa terputus yang boleh diterima.
3. Mengimbangi semula tanpa perbelanjaan berganda
Wilayah yang sihat melaporkan baki dan permintaan. Penyelaras mengurangkan bahagian kadar dan lonjakan wilayah sejuk dalam pajakan seterusnya, kemudian memberikan bahagian yang dilepaskan kepada wilayah panas. Sehingga pajakan lama disahkan dikembalikan atau tamat tempoh, pajakan lama dan baharu yang bertindih dikira terhadap kedua-dua had. Pengesahan pengembalian terlebih dahulu membatalkan bucket lama; peningkatan kapasiti di wilayah panas tidak mencipta baki, yang bermula pada sifar atau hanya menerima token yang disahkan dipindahkan. Pengembalian adalah idempoten; apabila status tidak pasti, pilih kurang penggunaan sementara daripada memperuntukkan bahagian yang sama dua kali.
4. Menjadikan semantik kegagalan eksplisit
Dengan had siling ketat, sesuatu wilayah hanya mengisi semula semasa pajakannya sah. Jika ia tidak dapat memperbaharui, penamatan tempoh membatalkan bucket tempatan dan membuang sebarang baki yang tidak dipindahkan melalui pengembalian yang disahkan; kosnya ialah kurang penggunaan sementara. Jika setiap wilayah mempunyai peruntukan kecemasan E di luar had lonjakan biasa, peruntukan tambahan maksimum ialah jumlah belanjawan yang boleh diaktifkan semasa terputus sambungan, dan mod tersebut tidak boleh mendakwa sifar lebihan had yang ketat. Kegagalan penyelaras tidak membatalkan pajakan yang telah dikeluarkan. Pengganti akan memulihkan lejar tahan lama, memagari (fence) pengeluar lama dengan epok yang lebih tinggi, dan terus mengira pajakan lama yang belum tamat tempoh.
Contoh jawapan yang mantap
“Token bucket serantau sedia ada kekal pada laluan segerak. Saya menambah penyelaras global yang mewakili 30,000 permintaan seminit sebagai kadar pengisian semula 500 permintaan sesaat dan menguruskan 6,000 permintaan kapasiti lonjakan secara berasingan. Ia mengeluarkan bahagian kadar dan lonjakan bertempoh serta dipagari epok, sambil memastikan bahawa pajakan aktif berjumlah paling banyak 500 permintaan sesaat dan 6,000 token lonjakan.
Setiap wilayah mengisi semula bucket tempatannya pada kadar yang dipajak dan mengehadkannya pada bahagian lonjakan yang dipajak. Pembaharuan tanpa gangguan mengekalkan baki, dan kapasiti tambahan tidak mencipta baki. Wilayah panas hanya menerima token yang disahkan dikembalikan, atau mula mengisi semula dari sifar selepas pajakan sejuk tamat tempoh. Di bawah had ketat, wilayah yang terpisah membatalkan bucket-nya selepas pajakan tamat tempoh. Jika perniagaan membenarkan 100 token kecemasan tambahan bagi setiap wilayah, lebihan had pemisahan yang didokumenkan adalah paling banyak jumlah belanjawan kecemasan yang peraturan pengaktifannya boleh bertindih. Failover memulihkan lejar pajakan dan menggunakan epok baharu. Saya akan menguji peralihan trafik, pengembalian pendua, pembaharuan bertindih, penyelewengan jam (clock skew), dan pemisahan rangkaian terhadap kedua-dua invarian.”
Kesilapan lazim
- Memberikan kadar penuh dan kapasiti lonjakan penuh kepada setiap wilayah → had global berganda mengikut bilangan wilayah → pajakkan bahagian kadar dan lonjakan secara berasingan.
- Menggunakan semula pajakan yang dikembalikan sebelum pengembalian dipastikan → token yang sama boleh dibelanjakan dua kali → jadikan pengembalian idempoten atau tunggu sehingga tamat tempoh.
- Menyebut “ketekalan akhirnya” (eventual consistency) tanpa batas ralat → tiada siapa tahu potensi lebihan had → nyatakan batas pajakan dan belanjawan kecemasan.
- Mengisi semula bucket tempatan pada setiap pembaharuan → setiap pembaharuan mencipta lonjakan baharu → kekalkan baki dan hanya kemas kini kadar, kapasiti, serta tempoh sah.
- Melakukan failover tanpa fencing → dua penyelaras mungkin mengeluarkan kuota yang sah serentak → sertakan epok monotonik pada setiap pajakan.
Soalan susulan dan jawapan
Bagaimanakah anda memilih saiz pajakan?
Pilih tempoh masa, bahagian kadar pengisian semula, dan bahagian lonjakan secara berasingan. Tetapkan tempoh masa daripada masa terputus sambungan yang boleh diterima, tetapkan kadar daripada permintaan terkini, dan tetapkan lonjakan daripada waktu puncak dalam kapasiti 6,000 global. Tempoh masa yang lebih pendek mempercepat pengimbangan semula dan mengetatkan batas kegagalan tetapi meningkatkan beban pembaharuan.
Apakah yang berlaku apabila trafik tiba-tiba beralih wilayah?
Penyelaras mengurangkan bahagian kadar dan lonjakan wilayah sejuk dalam pajakan seterusnya, kemudian memindahkan bahagian yang dilepaskan selepas pengembalian disahkan atau pajakan lama tamat tempoh. Sistem mungkin menolak permintaan buat sementara waktu walaupun terdapat kapasiti yang tidak digunakan semasa menunggu; itu adalah kos untuk mengelakkan peruntukan berlebihan yang bertindih.
Bagaimanakah anda mengembalikan Retry-After?
Gunakan yang terawal antara pengisian semula tempatan seterusnya di bawah pajakan semasa, pengaktifan pajakan baharu yang disahkan, atau pemulihan penyelaras yang dijangka, dibundarkan kepada kejituan yang disokong oleh respons. Jangan janjikan masa jika pemulihan tidak diketahui; sebaliknya kembalikan dasar percubaan semula (retry policy) yang terhad.
Bolehkah reka bentuk ini menjamin sifar lebihan had dan ketersediaan pemisahan penuh?
Hanya jika setiap bahagian rangkaian sudah memegang kuota pra-peruntukan yang mencukupi, yang boleh menyebabkan kapasiti terbiar, atau jika permintaan menyelaraskan secara segerak merentas wilayah, yang mengorbankan kependaman dan ketersediaan semasa pemisahan. Jawapan mesti memilih batas produk secara eksplisit.