Soalan dan skop
Anda sedang mereka bentuk laluan permintaan di mana perkhidmatan A memanggil B dan B memanggil C. Klien membenarkan 2 saat dari penerimaan sehingga respons. A mungkin menggunakan 500 ms sebelum memanggil B; B mungkin memanggil C dan perkhidmatan audit bukan kritikal. Terangkan kontrak untuk tarikh akhir (deadline), pembatalan (cancellation), percubaan semula (retry), dan kebolehcerapan (observability).
Anggap setiap lompatan (hop) boleh gagal secara bebas, jam tidak disegerakkan secara sempurna, dan RPC baca sahaja yang tamat masa hanya boleh dicuba semula apabila operasi tersebut adalah idempoten. Matlamatnya adalah untuk menghentikan kerja yang ditakdirkan gagal sambil mengekalkan belanjawan yang mencukupi untuk pensirilan (serialization) dan pengangkutan respons.
Perkara yang diuji oleh penemu duga
Rubrik reka bentuk sistem peringkat staf InterviewStack menjangkakan calon untuk menjelaskan kekangan kependaman dan kegagalan, mengenal pasti kesesakan (bottlenecks), dan mewajarkan pertukaran kompromi (trade-offs). Jawapan yang kukuh menukar isyarat-isyarat tersebut kepada kontrak belanjawan yang eksplisit:
- Satu tarikh akhir permintaan mutlak ditetapkan di pinggir (edge); setiap lompatan memperoleh baki belanjawannya dan bukannya mencipta had masa tamat (timeout) baharu.
- Pembatalan mengikut pepohon panggilan, termasuk cabang lindung nilai (hedged) atau selari, supaya respons yang telah selesai menghentikan kerja yang tidak lagi membantu.
- Percubaan semula menggunakan baki belanjawan yang sama dan dihadkan oleh sifat idempoten serta had percubaan.
- Metrik membezakan antara kehabisan tarikh akhir, pembatalan oleh pemanggil, kelewatan giliran, penolakan hiliran, dan kerja berguna yang diselesaikan selepas pembatalan.
Soalan penjelasan sebelum menjawab
- Adakah had 2 saat itu merupakan SLO yang dapat dilihat oleh pengguna atau tarikh akhir ketepatan yang ketat (hard correctness deadline)? Tarikh akhir yang ketat menjadikan hasil yang lewat tidak sah; SLO membenarkan laluan penyelesaian latar belakang yang dihadkan dengan teliti.
- Panggilan manakah yang kritikal kepada respons? Panggilan audit atau cadangan bukan kritikal boleh diasingkan, disampelkan, atau dikembalikan dengan respons yang terdegradasi; pengesahan pengebilan tidak boleh diperlakukan sedemikian.
- Adakah operasi tulis bersifat idempoten? Belanjawan percubaan semula adalah selamat untuk operasi baca atau perintah berkunci idempoten, tetapi tidak selamat untuk kesan sampingan yang tidak dilindungi.
- Adakah timbunan (stack) RPC menyebarkan konteks secara automatik? Jika tidak, takrifkan kontrak pemintas (interceptor) atau perisian tengah (middleware) dan uji pada setiap sempadan bahasa.
- Adakah kita memerlukan kerja untuk diselesaikan selepas pembatalan, seperti eksport bertitik semak (checkpointed export)? Pengecualian tersebut memerlukan kontrak tugas tahan lama (durable job contract) dan bukannya mengabaikan pembatalan secara senyap.
Kerangka jawapan 30 saat
"Saya menetapkan satu tarikh akhir pada bahagian masuk (ingress) dan membawa baki belanjawan melalui konteks RPC. Setiap perkhidmatan menyemak pembatalan sebelum dimasukkan ke dalam giliran dan semasa kerja yang panjang, kemudian menghantar belanjawan anak yang lebih pendek yang meninggalkan ruang kendur (slack) untuk respons dan rangkaian. Percubaan semula hanya menggunakan masa yang tinggal, dihadkan, dan memerlukan sifat idempoten. Apabila pemanggil mendapat hasil atau membatalkannya, isyarat pembatalan disebarkan (fan out) ke setiap cabang. Saya mengukur kadar tarikh akhir dilebihi, baki belanjawan pada setiap lompatan, masa giliran, kependaman pembatalan, dan kerja yang lewat, kemudian melakukan ujian beban pada rantaian tersebut serta menyuntik kebergantungan yang perlahan atau dibatalkan."
Jawapan mendalam langkah demi langkah
1. Menetapkan dan mewakili belanjawan
Bahagian pinggir merekodkan tarikh akhir mutlak, contohnya t0 + 2s. Menetapkannya sebagai satu titik masa mengelakkan setiap lompatan daripada menambah 2 saat lagi secara senyap. Sesuatu perkhidmatan mengira remaining = deadline - now dan memperuntukkan margin tempatan yang kecil untuk pensirilan dan transit rangkaian. Margin tersebut ialah satu dasar, bukan pemalar sejagat; sahkan margin ini dengan data persentil kependaman.
Panduan gRPC membezakan tarikh akhir (deadline) daripada had masa tamat (timeout) dan mengesyorkan tarikh akhir klien yang eksplisit. Ia juga menukar tarikh akhir yang disebarkan kepada masa yang tinggal supaya herotan jam (clock skew) tidak menyebabkan pelayan hiliran menunggu melebihi belanjawan asal. Oleh itu, kontrak wayar (wire contract) harus membawa konteks tarikh akhir melalui pustaka RPC, bukan pengepala aplikasi bentuk bebas yang mungkin dilupakan oleh pemanggil.
2. Membelanjakan belanjawan mengikut laluan kritikal
Katakan A telah menggunakan 500 ms. Ia memajukan paling banyak 1.5 saat kepada B. Jika B memerlukan 400 ms untuk kerja tempatan dan memanggil C, B memajukan nilai yang lebih kecil antara baki belanjawannya ditolak margin respons 100 ms dan had atas khusus perkhidmatan C. Panggilan selari berkongsi tarikh akhir induk yang sama; ia tidak menerima 1.5 saat penuh setiap satu.
Kemasukan giliran menyemak baki belanjawan. Jika anggaran kelewatan giliran sudah melebihi baki tersebut, tolak dengan pantas (reject fast) atau kembalikan respons terdegradasi yang didokumentasikan. Ini menghalang sesuatu permintaan daripada menduduki pekerja (worker) selepas kejayaan menjadi mustahil.
3. Menyebarkan pembatalan, bukan hanya tamat tempoh
Tamat tempoh tarikh akhir hanyalah satu sebab pembatalan; pemanggil yang menutup sambungan atau cabang lain yang memenangi lindung nilai (hedge) adalah sebab yang lain. Setiap RPC anak menerima konteks pembatalan induk. Pekerja menyemaknya sebelum langkah-langkah intensif dan pada selang masa yang terhad semasa gelung (loop), kemudian melepaskan permit dan menutup strim.
Google SRE memberi amaran bahawa penyebaran tarikh akhir sahaja masih boleh membocorkan kerja apabila panggilan yang lebih dalam gagal awal. Pembatalan mesti bergerak kembali ke atas dan disebarkan (fan out) kepada cabang-cabang setara (siblings). Tugas tahan lama yang bertitik semak boleh menyelesaikan titik semak yang selamat, tetapi itu ialah aliran kerja tak segerak (asynchronous) eksplisit dengan API statusnya sendiri, bukan RPC segerak yang mengabaikan pembatalan.
4. Menjadikan percubaan semula peka belanjawan
Kira attempt_deadline = min(parent_remaining - response_margin, per-attempt_cap). Berhenti apabila percubaan seterusnya tidak dapat diselesaikan sebelum tarikh akhir induk. Cuba semula kegagalan sementara sahaja dan hanya operasi yang secara semula jadi bersifat idempoten atau dilindungi oleh kunci idempoten. Permintaan terlindung nilai (hedged requests) menggunakan belanjawan induk yang sama dan membatalkan percubaan yang kalah sebaik sahaja satu respons yang boleh diterima tiba.
Jangan gabungkan had masa tamat percubaan semula yang panjang dengan pemutus litar (circuit breaker) yang tidak mempunyai pengetahuan tentang baki belanjawan. Rekod nombor percubaan dan tarikh akhir asal supaya perkhidmatan hiliran dapat membezakan permintaan baharu daripada percubaan semula yang hampir tamat tempoh.
5. Menakrifkan semantik kegagalan yang boleh dicerap
Kembalikan status yang stabil untuk kehabisan tarikh akhir, seperti DEADLINE_EXCEEDED dalam gRPC, dan kekalkan punca pembatalan asal dalam log. Medan surih (trace fields) harus merangkumi tarikh akhir asal, baki belanjawan semasa masuk dan keluar, kelewatan giliran, bilangan percubaan, dan kependaman dari pembatalan ke berhenti. Sediakan amaran (alert) untuk belanjawan yang dibelanjakan dalam giliran dan untuk kerja berguna selepas pembatalan, bukan hanya kependaman hujung-ke-hujung.
Uji kontrak tersebut dengan abah-abah integrasi tiga lompatan (three-hop integration harness): lengahkan C melebihi baki belanjawan, batalkan pada A semasa B berada dalam giliran, jadikan lindung nilai pertama berjaya, dan suntik ofset jam. Pastikan (assert) bahawa tiada anak yang berjalan melebihi tarikh akhir induk kecuali titik semak yang diisytiharkan secara eksplisit, percubaan semula dihentikan, dan permit dilepaskan.
Contoh jawapan berkualiti tinggi
"Saya akan menjadikan bahagian masuk sebagai pemilik tunggal tarikh akhir 2 saat tersebut. A menerimanya dalam konteks RPC, dan selepas 500 ms ia memajukan baki belanjawan kepada B. B menolak margin responsnya sendiri sebelum memanggil C; cabang selari masih berkongsi tarikh akhir induk yang sama. Setiap anak memerhatikan pembatalan sebelum dimasukkan ke dalam giliran dan semasa melakukan kerja terhad, dan pembatalan tersebar apabila klien terputus sambungan atau lindung nilai menang. Percubaan semula dihadkan kepada baki belanjawan dan memerlukan sifat idempoten. Panggilan audit yang lewat boleh diasingkan ke dalam tugas yang tahan lama, tetapi respons kritikal tidak boleh berpura-pura bahawa kerja yang lewat itu berguna. Saya akan membuktikan kontrak tersebut dengan suntikan kebergantungan perlahan, kelewatan giliran, perlumbaan pembatalan, herotan jam, dan surihan yang menunjukkan belanjawan pada setiap lompatan."
Kesilapan biasa
- Memberikan had masa tamat baharu pada setiap lompatan → pepohon panggilan boleh berjalan selama N kali ganda belanjawan pengguna → sebarkan satu tarikh akhir dan kira masa yang tinggal.
- Menyebarkan tamat tempoh tetapi mengabaikan pembatalan pemanggil → permintaan terlindung nilai dan yang ditinggalkan terus menggunakan pekerja → sebarkan konteks pembatalan ke seluruh cabang dan ukur kependaman berhenti.
- Mencuba semula setiap masa tamat → operasi tulis bukan idempoten boleh menduplikasi kesan sampingan dan percubaan semula yang tamat tempoh meningkatkan beban → wajibkan sifat idempoten, kelaskan ralat, dan hadkan percubaan mengikut baki belanjawan.
- Memasukkan ke dalam giliran sebelum menyemak belanjawan → permintaan yang ditakdirkan gagal menduduki kapasiti yang terhad → tolak atau degradasi apabila kelewatan giliran tidak dapat memuatkan masa yang tinggal.
- Menggunakan margin tetap tanpa pengukuran → muatan (payload) yang besar gagal secara konsisten atau ruang kendur kependaman dibazirkan → peroleh margin daripada persentil pengangkutan dan pensirilan.
- Menyembunyikan kerja yang lewat sebagai kejayaan → papan pemuka menunjukkan respons yang sihat sedangkan sumber sedang bocor → asingkan tarikh akhir segerak daripada tugas bertitik semak yang eksplisit.
Soalan susulan dan jawapan
Bagaimana jika jam berbeza antara perkhidmatan?
Jangan bandingkan cap masa jam dinding (wall-clock) mentah daripada mesin yang bebas. Gunakan penukaran masa tinggal pustaka RPC atau sebarkan had masa tamat selepas menolak masa yang telah berlalu. Tambahkan ujian ofset jam pada abah-abah ujian.
Patutkah tarikh akhir dilanjutkan di hiliran?
Hanya dengan menukar kontrak produk kepada tugas tak segerak. Melanjutkan tarikh akhir anak yang segerak tidak dapat menjadikan respons induk yang lewat sah; ia hanya meningkatkan pembaziran kerja.
Bagaimanakah anda memperuntukkan belanjawan untuk muatan yang perlahan?
Ukur bahagian ekor (tail) pensirilan dan rangkaian secara berasingan, peruntukkan margin yang terhad, dan hadkan saiz muatan atau gunakan penstriman. Jika margin tersebut berulang kali menggunakan belanjawan, ubah SLO atau bentuk respons dan bukannya meningkatkan setiap had masa tamat secara senyap.
Apakah yang terselamat daripada pembatalan?
Hanya kerja yang eksplisit tahan lama dan idempoten seperti penulisan titik semak atau peristiwa audit. Ia mesti boleh dicerap di bawah pengecam tugas dan tidak boleh memegang pekerja atau sambungan permintaan segerak tersebut.