Kehendak Soalan dan Masa Soalan Ini Digunakan
Satu perkhidmatan pesanan mempunyai kapasiti mampan yang diuji beban sebanyak 3,000 permintaan sesaat pada kependaman p99 250 ms. Semasa promosi, ketibaan trafik meningkat kepada 8,000 permintaan sesaat. Kebergantungan inventori menjadi perlahan, bilangan permintaan dalam proses (in-flight) dan usia barisan gilir kedua-duanya meningkat, klien mencuba semula, dan penskalaan automatik (autoscaling) memerlukan tiga minit sebelum tika baharu sedia. Penyerahan pesanan kritikal, semakan ketersediaan interaktif, dan penyesuaian kelompok dalaman berkongsi perkhidmatan ini.
Reka bentuk dasar perlindungan lebihan beban yang memastikan proses kekal responsif dan mengekalkan sebanyak mungkin kerja yang berguna. Terangkan isyarat pengesanan, batas konkurensi dan barisan gilir, kawalan kemasukan (admission control), keutamaan permintaan, degradasi anggun, tingkah laku percubaan semula, pemulihan, dan pengesahan. Angka-angka ini ialah andaian temu duga, bukan dakwaan tentang sistem pengeluaran tertentu.
Ini ialah soalan backend kerana keputusan terasnya ialah bagaimana satu perkhidmatan melindungi CPU, memori, bebenang (threads), sambungan, dan panggilan hiliran (downstream). Pengehad kadar teragih menguatkuasakan dasar trafik merentasi penyewa atau tetingkap masa; soalan ini bermula selepas trafik yang dibenarkan masih lebih besar daripada kapasiti semasa perkhidmatan. Had masa tamat (timeouts), percubaan semula, dan pemutus litar (circuit breakers) melindungi panggilan kebergantungan individu, manakala kawalan lebihan beban memutuskan kerja baharu mana yang mampu diterima oleh perkhidmatan.
Perkara yang Dinilai oleh Penemu Duga
Jawapan yang kukuh mengenal pasti ketepuan daripada kerja tempatan, bukan daripada kadar permintaan semata-mata. Ambang permintaan sesaat yang tetap akan gagal apabila satu permintaan menjadi lima kali lebih mahal untuk diproses atau kelembapan kebergantungan memegang sambungan lebih lama. Kerja dalam proses, usia barisan gilir, slot pekerja atau sambungan yang tersedia, CPU, tekanan memori, dan kelonggaran tarikh akhir (deadline slack) mendedahkan sumber yang sebenarnya sedang kehabisan.
Isyarat seterusnya ialah sistem yang terikat (bounded). Barisan gilir tanpa batas mengubah permintaan berlebihan menjadi pertambahan memori dan lambakan permintaan lapuk. Calon perlu mengehadkan kerja konkuren pada kekangan (bottleneck), memastikan barisan gilir kecil atau menghapuskannya, dan menolak dengan kos rendah sebelum penghuraian (parsing) yang mahal atau panggilan hiliran dilakukan. Matlamatnya ialah kerja berguna yang berjaya, bukan menerima setiap permintaan atau memaksimumkan percubaan mentah.
Penemu duga juga mahukan dasar yang peka terhadap perniagaan. Penyerahan pesanan kritikal boleh menerima bahagian yang dikhaskan; semakan ketersediaan boleh menggunakan cache jangka pendek; penyesuaian kelompok boleh dijeda. Keutamaan masih memerlukan keadilan bagi setiap penyewa supaya satu pelanggan besar tidak menggunakan setiap slot yang dikhaskan. Akhir sekali, reka bentuk tersebut memerlukan gelung pemulihan tertutup: menyekat amplifikasi percubaan semula, menskalakan kapasiti sebagai tindak balas yang lebih perlahan, meningkatkan kemasukan semula secara beransur-ansur, dan menguji laluan terdegradasi sebelum insiden berlaku.
Soalan untuk Dijelaskan Sebelum Menjawab
- Sumber manakah yang tepu dahulu? Ketepuan CPU memerlukan had konkurensi atau kos tempatan. Kebergantungan yang perlahan memerlukan sekat lindung (bulkhead) sambungan/konkurensi yang berasingan. Pertambahan memori atau usia barisan gilir mungkin memerlukan barisan gilir yang lebih kecil dan penolakan lebih awal. Setiap bottleneck mengubah isyarat kemasukan.
- Operasi manakah yang penting dan apa yang boleh didegradasi? Di sini, penyerahan pesanan adalah kritikal, ketersediaan boleh bertolak ansur dengan data yang agak lapuk, dan penyesuaian kelompok boleh dijeda. Jika setiap operasi diwajibkan dari segi undang-undang untuk menggunakan inventori terkini, jalan keluar cache adalah tidak sah dan kegagalan eksplisit adalah lebih selamat.
- Berapakah tarikh akhir hujung ke hujung (end-to-end deadline)? Masa barisan gilir menggunakan tarikh akhir yang sama dengan pelaksanaan. Perkhidmatan harus membuang kerja yang tidak lagi dapat diselesaikan dan menyebarkan pembatalan ke hiliran.
- Adakah permintaan sama mahal dari segi kos pemprosesan? Satu token bagi setiap permintaan hanya berfungsi apabila kosnya serupa. Titik akhir (endpoints) yang mahal mungkin memerlukan permit berwajaran atau kolam berasingan supaya kerja kritikal yang murah tidak terperangkap di belakang tugas kelompok yang mahal.
- Bolehkah klien mencuba semula dengan selamat? Bacaan yang ditolak boleh dicuba semula kemudian. Penulisan pesanan memerlukan kunci kedaksegeraan (idempotency key) dan semakan hasil. Perkhidmatan mesti membezakan "cuba semula kemudian" daripada "jangan cuba semula", dan semua lapisan mesti berkongsi belanjawan percubaan semula (retry budget).
- Adakah peralihan trafik tersedia? Failover ke rantau yang sihat boleh menyerap kerja hanya jika sasaran mempunyai kapasiti lebihan yang disahkan. Memindahkan lebihan beban secara membuta tuli boleh mewujudkan kegagalan kedua.
Kerangka Jawapan 30 Saat
"Saya akan melindungi kekangan (bottleneck) dengan gelung tertutup yang kecil. Pertama, gunakan ujian beban untuk menetapkan batas konkurensi dan barisan gilir bagi setiap tika, kemudian perhatikan kerja tempatan dalam proses, usia barisan gilir, CPU, memori, kolam sambungan, dan baki tarikh akhir. Apabila ketepuan meningkat, tolak kerja baharu sebelum pemprosesan yang mahal, khaskan kapasiti untuk penyerahan pesanan, kekalkan keadilan dalam setiap keutamaan, hidangkan respons cache yang diluluskan untuk ketersediaan, dan jedakan kerja kelompok. Penolakan menggunakan respons lebihan beban sementara yang jelas, manakala klien hanya mencuba semula operasi idempoten dengan backoff, variasi rawak (jitter), dan belanjawan percubaan semula yang dikongsi. Penskalaan automatik menambah kapasiti tetapi terlalu perlahan untuk menjadi pertahanan pertama. Saya akan memulihkan keadaan dengan histeresis dan peningkatan kemasukan secara beransur-ansur, kemudian mengesahkan memori terikat, daya pemprosesan berguna, kejayaan operasi kritikal, keadilan, amplifikasi percubaan semula, dan pemulihan di bawah ujian lebihan beban."
Perbincangan Terperinci Langkah demi Langkah
Mulakan dengan batas kapasiti yang diukur. Angka 3,000 permintaan sesaat hanya sah untuk campuran permintaan yang diuji, kependaman kebergantungan, bilangan tika, dan sasaran p99 250 ms. Catatkan kerja dalam proses bagi setiap tika, CPU, memori, penggunaan pekerja, dan penggunaan sambungan hiliran yang sepadan. Kadar permintaan ialah input; keputusan kemasukan harus mengikut sumber yang paling hampir dengan kegagalan. Contohnya, apabila inventori menjadi perlahan, kadar ketibaan yang sama menghasilkan lebih banyak panggilan dalam proses, jadi pengawal berasaskan kadar sahaja bertindak balas terlalu lewat.
Letakkan had konkurensi bebas di sekeliling sumber yang terhad. Pengendali pesanan memerlukan had keseluruhan, manakala panggilan inventori dan kerja kelompok mendapat sekat lindung (bulkheads) yang lebih kecil. Permit diperoleh sebelum memperuntukkan kerja yang mahal dan dilepaskan apabila berjaya, gagal, tamat masa, atau dibatalkan. Jika kos permintaan berbeza secara ketara, gunakan permit berwajaran atau kolam titik akhir yang berasingan. Had kod tegar ialah titik permulaan yang selamat daripada ujian beban; had penyesuaian boleh meningkatkan penggunaan, tetapi ia memerlukan maklum balas yang stabil, pagar kawalan (guardrails), dan pengembalian semula (rollback) yang pantas.
Pastikan penggiliran adalah eksplisit dan terikat. Barisan gilir yang pendek boleh menyerap lonjakan trafik sementara, tetapi hadnya harus ditentukan daripada kelonggaran tarikh akhir dan bukannya memori yang tersedia. Tolak apabila barisan gilir penuh atau apabila anggaran kelewatan barisan gilir meninggalkan terlalu sedikit masa untuk diselesaikan. Barisan gilir tanpa batas tidak boleh mencipta kapasiti; ia meningkatkan kependaman ekor (tail latency), menahan memori, dan menyebabkan klien mencuba semula permintaan yang sebenarnya sudah pun menunggu. Pantau kedua-dua kedalaman barisan gilir dan usia item tertua kerana barisan gilir kecil bagi kerja yang mahal masih boleh menjadi lapuk.
Kawalan kemasukan harus gagal secara murah dan konsisten. Di get laluan, kuat kuasakan kuota penyewa kontraktual dan had trafik kasar. Pada setiap tika perkhidmatan, gunakan ketepuan tempatan untuk melindungi tugas yang memiliki sumber tersebut. Jika perkhidmatan mikro hiliran terlebih beban, tolak di peringkat huluan sebelum melakukan kerja yang akan dibuang kemudian. Bawa tahap kepentingan permintaan di sepanjang laluan panggilan supaya pesanan yang sama tidak diterima oleh satu lapisan dan kemudian ditolak secara rawak selepas menggunakan sumber di lapisan lain.
Gunakan dasar keutamaan dengan peruntukan kapasiti eksplisit:
| Kelas | Tindakan lebihan beban | Sebab |
|---|---|---|
| Penyerahan pesanan | Konkurensi dikhaskan; tolak hanya selepas hadnya sendiri dicapai | Mengekalkan laluan kritikal tanpa memberikan kapasiti tanpa had |
| Semakan ketersediaan | Utamakan data cache jangka pendek dengan kontrak kesegaran yang jelas; jika tidak, tolak | Mengurangkan kerja hiliran tanpa mereka-reka jawapan |
| Penyesuaian kelompok | Jeda pengambilan dan sambung semula daripada kemajuan tahan lasak kemudian | Kerja adalah penting tetapi tidak memerlukan tarikh akhir interaktif |
Keutamaan tanpa keadilan boleh menjejaskan penyewa kecil. Gunakan kuota penyewa atau penjadualan adil dalam sesuatu kelas, dan kekalkan bahagian minimum untuk pemulihan atau trafik kawalan. Elakkan berpuluh-puluh tahap keutamaan: pengendali mesti dapat meramalkan permintaan mana yang diterima semasa insiden berlaku.
Apabila had dicapai, kembalikan respons sebelum kerja pangkalan data atau kebergantungan dilakukan. HTTP 503 mewakili lebihan beban sementara dan mungkin menyertakan Retry-After; ia tidak memberi kebenaran kepada setiap klien untuk mencuba semula secara serentak. Klien menggunakan backoff eksponen terikat dengan jitter, tarikh akhir, dan belanjawan percubaan semula. Cuba semula pada satu lapisan yang sesuai dan bukannya setiap lapisan. Penciptaan pesanan menggunakan semula kunci kedaksegeraan dan membuat pertanyaan bagi hasil sebelumnya selepas masa tamat yang tidak jelas. Permintaan yang tarikh akhir pemanggilnya telah tamat dibatalkan supaya pelayan tidak menyiapkan kerja yang sia-sia.
Degradasi anggun mengurangkan kos dan bukannya sekadar menolak. Ketersediaan boleh melangkau pengayaan pilihan atau menggunakan cache usia terikat jika kontrak produk membenarkannya. Pengguna kelompok boleh berhenti menarik mesej. Sandaran yang melaporkan stok lapuk sebagai terkini adalah tidak jujur; apabila kesegaran adalah wajib, kembalikan keputusan tidak tersedia yang eksplisit. Latih degradasi secara berterusan pada sebahagian kecil trafik kerana laluan kecemasan yang tidak digunakan berkemungkinan gagal apabila diperlukan.
Penskalaan automatik, limpahan serantau, dan peningkatan kapasiti tetap berguna, tetapi ia beroperasi selepas kawalan kemasukan. Penskalaan berdasarkan jumlah permintaan mentah boleh menambah tika semasa trafik murah dan ketinggalan semasa trafik mahal; sertakan konkurensi, usia barisan gilir, atau ketepuan sumber. Tika baharu harus memanaskan sambungan sebelum menerima bahagian beban penuh. Failover memerlukan semakan kapasiti destinasi. Kedua-dua mekanisme ini tidak mewajarkan pembuangan batas tempatan.
Pemulihan menggunakan ambang keluar yang lebih rendah daripada ambang masuk. Selepas kerja dalam proses, usia barisan gilir, dan kesihatan kebergantungan kekal di bawah ambang tersebut untuk tempoh bertenang (hold period), tingkatkan beban yang diterima secara berperingkat. Kekalkan peruntukan keutamaan sehingga kependaman normal stabil. Histeresis dan peningkatan berperingkat ini menghalang sistem daripada bertukar ganti antara keadaan terbuka dan terlebih beban atau membanjiri kebergantungan yang baru pulih sebahagiannya.
Sahkan dasar melebihi ujian kapasiti nominal. Mainkan semula campuran kos permintaan pengeluaran, kemudian tingkatkan ketibaan daripada 3,000 kepada 8,000 permintaan sesaat sambil memperlahankan inventori dan menangguhkan penskalaan automatik selama tiga minit. Tambahkan percubaan semula klien yang disegerakkan, satu penyewa yang menyalahgunakan sistem, tarikh akhir yang tamat, dan pemulihan kebergantungan. Pastikan barisan gilir dan memori terikat, penggunaan pekerja dan sambungan yang stabil, penolakan kos rendah, kejayaan pesanan dalam peruntukannya, keadilan penyewa, degradasi yang jujur, amplifikasi percubaan semula yang terkawal, dan kepulangan beransur-ansur kepada keadaan normal. Ukur operasi berguna yang selesai secara berasingan daripada permintaan yang diterima dan percubaan hiliran.
Contoh Jawapan Berkualiti Tinggi
"Kapasiti mampan 3,000 permintaan sesaat ialah hasil ujian beban untuk satu campuran permintaan, jadi saya akan terlebih dahulu mengenal pasti sumber pada sempadan tersebut. Semasa kelembapan inventori, panggilan dalam proses dan penggunaan sambungan adalah lebih berguna daripada kadar permintaan. Saya akan menetapkan had konkurensi setiap tika yang telah diuji untuk perkhidmatan, sekat lindung (bulkhead) yang lebih kecil untuk inventori, dan barisan gilir kecil yang masa menunggunya masih menepati tarikh akhir permintaan. Sebaik sahaja mana-mana batas dicapai, perkhidmatan akan menolak sebelum melakukan kerja yang mahal.
Saya akan mengklasifikasikan trafik kepada penyerahan pesanan, ketersediaan, dan penyesuaian. Pesanan menerima kapasiti yang dikhaskan tetapi masih mempunyai had tegar. Ketersediaan boleh menggunakan cache jangka pendek hanya jika API mendedahkan kontrak kesegaran tersebut. Penyesuaian dijeda dan disambung semula daripada kemajuan yang disimpan. Dalam setiap kelas, saya akan menguatkuasakan keadilan penyewa, supaya seorang pelanggan tidak boleh mengambil keseluruhan peruntukan. Saya juga akan menyebarkan keutamaan ke hiliran untuk mengelakkan pembaziran kerja pada permintaan yang akhirnya digugurkan secara rawak oleh perkhidmatan kemudian.
Lebihan beban sementara mengembalikan 503 dan, apabila kita boleh menganggarkannya, Retry-After. Klien masih memerlukan backoff terikat, jitter, tarikh akhir, dan belanjawan percubaan semula yang dikongsi. Hanya satu lapisan yang mencuba semula, dan penulisan pesanan menggunakan semula kunci kedaksegeraan. Pemanggil yang tamat tempoh membatalkan kerja hiliran.
Penskalaan automatik ialah gelung kapasiti yang lebih perlahan kerana tika memerlukan tiga minit. Saya akan menskalakan berdasarkan isyarat ketepuan dan memanaskan tika baharu, manakala kawalan kemasukan tempatan mengekalkan armada sedia ada terus berfungsi. Pemulihan memerlukan ambang keluar yang lebih rendah dan peningkatan kemasukan secara beransur-ansur.
Buktinya ialah ujian lebihan beban pada 8,000 permintaan sesaat dengan inventori perlahan, penskalaan tertangguh, percubaan semula, kos permintaan bercampur, dan penyewa yang bising. Saya menjangkakan memori dan barisan gilir terikat, daya pemprosesan berguna yang stabil, peruntukan pesanan dan keadilan yang dijanjikan, penolakan kos rendah, tiada ribut percubaan semula (retry storm), dan pemulihan terkawal selepas inventori kembali normal."
Kesilapan Biasa
- Menaikkan had barisan gilir sehingga ralat hilang → Permintaan yang diterima menunggu lebih lama, menggunakan memori, tamat tempoh, dan mencetuskan percubaan semula tanpa menambah kapasiti pelaksanaan → Ikat penggiliran daripada kelonggaran tarikh akhir dan tolak awal.
- Mengesan lebihan beban hanya daripada permintaan sesaat → Kos permintaan dan kependaman kebergantungan berubah, jadi kadar yang sama boleh jadi selamat atau membawa bencana → Gunakan kerja tempatan dalam proses, usia barisan gilir, ketepuan sumber, dan kolam kebergantungan.
- Membiarkan penskalaan automatik menjadi pertahanan pertama → Kelewatan tiga minit membolehkan barisan gilir dan percubaan semula menggugat kestabilan armada semasa → Kekalkan batas kemasukan tempatan, kemudian skalakan untuk memulihkan ruang lega (headroom).
- Memberikan keutamaan tanpa had kepada trafik kritikal → Ia boleh menghabiskan sumber yang sama dan menjejaskan kerja pemulihan → Khaskan kapasiti tetapi kekalkan had tegar dan keadilan.
- Menggugurkan beban secara rawak pada setiap perkhidmatan mikro → Kerja huluan digunakan sebelum penolakan rawak di peringkat hiliran, mengurangkan kejayaan berguna hujung ke hujung → Sebarkan tahap kepentingan dan tolak seawal mungkin sebaik sahaja bottleneck diketahui.
- Mengembalikan 503 dan membiarkan setiap klien mencuba semula → Percubaan semula yang disegerakkan menggandakan beban berlebihan → Gunakan jitter, tarikh akhir, satu lapisan percubaan semula, dan belanjawan percubaan semula.
- Menghidangkan sandaran data lapuk tanpa tanda → Sistem kelihatan tersedia sedangkan ia melanggar semantik inventori → Dedahkan kontrak kesegaran atau gagalkan secara eksplisit.
- Memulihkan trafik penuh serta-merta → Kebergantungan yang sedang pulih akan terlebih beban semula → Gunakan histeresis, probe terikat, dan peningkatan kemasukan secara beransur-ansur.
- Hanya menjejaki trafik yang diterima → Kadar penerimaan yang tinggi boleh menyembunyikan masa tamat, kerja yang terbuang, dan percubaan semula → Ukur penyempurnaan berguna, kos penolakan, pembaziran tarikh akhir, dan amplifikasi percubaan.
Soalan Susulan dan Maklum Balas
Soalan Susulan 1: Mengapa tidak menyelesaikan perkara ini dengan pengehad kadar teragih?
Pengehad kadar teragih berguna untuk kuota kontraktual, kawalan penyalahgunaan, dan pembentukan trafik sebelum permintaan sampai ke perkhidmatan. Ia tidak boleh dengan sendirinya memerhatikan bahawa kependaman inventori telah meningkatkan kos bagi setiap permintaan yang dibenarkan. Kekalkan had get laluan, kemudian tambahkan konkurensi tempatan dan perlindungan barisan gilir pada pemilik sumber. Jika kos permintaan stabil dan perkhidmatan mempunyai satu bottleneck, had kadar yang konservatif mungkin merupakan penyelesaian yang lebih mudah dan mencukupi.
Soalan Susulan 2: Bagaimanakah anda memilih had konkurensi?
Mulakan daripada ujian beban yang menggunakan campuran permintaan pengeluaran dan cari konkurensi tertinggi yang masih memenuhi sasaran kependaman dan sumber dengan ruang lega. Ulangi ujian dengan kelembapan kebergantungan. Hubungan keadaan mantap antara konkurensi, daya pemprosesan, dan masa boleh memberikan semakan kewarasan (sanity check), tetapi ia tidak menjamin kapasiti di bawah ketibaan trafik yang melonjak atau kos yang bercampur-campur. Lancarkan had dalam mod pemerhatian sahaja, lakukan penolakan kanari, dan kemudian penguatkuasaan; semak semula apabila kod, saiz tika, atau kebergantungan berubah.
Soalan Susulan 3: Bagaimana jika 90% daripada trafik ditandakan sebagai kritikal?
Maka label itu tidak lagi berguna untuk membuat keputusan kemasukan. Tentukan kekritikan daripada operasi perniagaan, sahkan pihak yang boleh menetapkannya, hadkan setiap kelas, dan khaskan hanya bahagian yang diukur. Dalam kelas kritikal, gunakan keadilan penyewa atau keutamaan stabil pengguna supaya lebihan beban tidak memihak secara sewenang-wenangnya kepada klien yang paling bising. Jika permintaan yang benar-benar kritikal melebihi kapasiti fizikal, sesetengah kerja kritikal masih mesti digagalkan; kontrak harus menyatakan kaedahnya.
Soalan Susulan 4: Bolehkah konkurensi penyesuaian (adaptive concurrency) menjadikan reka bentuk lebih baik?
Ia boleh mengikut perubahan masa perkhidmatan dengan lebih dekat berbanding had statik, tetapi kependaman yang bising dan maklum balas yang tertangguh boleh menyebabkan ayunan atau penyingkiran beban palsu. Mulakan dengan had statik yang diuji. Tambahkan kawalan penyesuaian hanya dengan had minimum dan maksimum, isyarat yang dilicinkan, histeresis, nilai sandaran yang stabil, dan ujian main semula yang merangkumi kemerosotan pantas dan pemulihan perlahan.
Soalan Susulan 5: Di manakah load shedding sepatutnya berlaku dalam graf panggilan yang dalam?
Pemilik sumber memerlukan barisan pertahanan terakhir tempatan. Sebaik sahaja perkhidmatan tersebut memberi isyarat lebihan beban, lapisan huluan harus menghentikan kerja lebih awal dan mengekalkan keputusan kekritikan yang sama di sepanjang laluan panggilan. Penyingkiran beban hanya di pinggir (edge) kekurangan maklumat status hiliran yang tepat; penyingkiran hanya di daun (leaf) membazirkan kerja huluan. Reka bentuk praktikal menggabungkan dasar pinggir yang kasar, perlindungan tempatan, dan isyarat lebihan beban yang boleh diambil tindakan oleh pemanggil huluan.
Soalan Susulan 6: Metrik pengeluaran manakah yang menunjukkan bahawa dasar ini berfungsi?
Jejaki penyempurnaan berguna dan kependaman mengikut operasi dan keutamaan; permintaan yang diterima, diatur dalam barisan gilir, didegradasi, dan ditolak; usia barisan gilir tertua; kerja dalam proses; ketepuan CPU, memori, pekerja, dan sambungan; kerja yang tamat tarikh akhir; keadilan setiap penyewa; percubaan fizikal bagi setiap permintaan logik; kelewatan kesediaan penskalaan automatik; dan masa yang dihabiskan dalam mod lebihan beban. Berikan amaran jika peruntukan kritikal hilang, lebihan beban berterusan, kos penolakan menghampiri kos permintaan normal, atau jika peningkatan pemulihan berulang kali merosot semula.