Topik temu duga representatif

Temu duga reka bentuk sistem: Mereka bentuk enjin aliran kerja tahan lasak (durable) dengan kelulusan manusia

Reka bentuk sistemSukar
Pasukan Editorial Offer.ccDiterbitkan Dikemas kini

Soalan

Reka bentuk enjin aliran kerja untuk proses yang ditakrifkan oleh pelanggan sehingga 20 langkah. Satu langkah memerlukan kelulusan manusia dan mungkin menunggu selama berhari-hari; aktiviti boleh gagal, dihantar dua kali, atau berjaya semasa respons hilang. Sistem mesti pulih daripada kegagalan dan menyokong had masa tamat (timeout), pembatalan, audit, dan peningkatan versi. Terangkan model keadaan, penjadualan, keidempotenan, keselamatan panggilan balik, skala, dan pertukaran kompromi (tradeoffs).

Prompt dan konteks

Reka bentuk enjin aliran kerja untuk proses yang ditakrifkan oleh pelanggan sehingga 20 langkah. Satu langkah memerlukan kelulusan manusia dan mungkin menunggu selama berhari-hari; aktiviti boleh gagal, dihantar dua kali, atau berjaya semasa respons hilang. Sistem mesti pulih daripada kegagalan dan menyokong had masa tamat (timeout), pembatalan, audit, dan peningkatan versi. Terangkan model keadaan, penjadualan, keidempotenan, keselamatan panggilan balik, skala, dan pertukaran kompromi (tradeoffs).

Soalan reka bentuk sistem ini sesuai untuk peranan bahagian belakang (backend), platform, dan infrastruktur. Fokusnya adalah semantik pelaksanaan tahan lasak (durable execution semantics), bukannya melukis baris gilir (queue) yang mudah. Had 20 langkah dan menunggu berhari-hari adalah andaian temu duga; jelaskan daya pemprosesan (throughput), kependaman (latency), pengasingan penyewa (tenant isolation), kepekaan data, sasaran pemulihan, dan kewajipan pengekalan terlebih dahulu.

Perkara yang diuji oleh penemu duga

Penemu duga mencari pemisahan antara keadaan aliran kerja, pelaksanaan aktiviti, dan kesan sampingan luaran; pengakuan eksplisit bahawa aktiviti mungkin dijalankan sekurang-kurangnya sekali (at least once); dan kunci keidempotenan yang terikat kepada invarian perniagaan. Kelulusan manusia memerlukan kelayakan guna sekali (single-use) yang tidak boleh dipalsukan dan mempunyai tarikh luput. Jawapan tersebut juga perlu mentakrifkan sejarah peristiwa, syot kilat (snapshots), pemasa, pembatalan, versi, dan pembaikan operasi.

Soalan untuk dijelaskan terlebih dahulu

  • Apakah tahap keserentakan (concurrency) bagi setiap penyewa, kadar permulaan aliran kerja, dan masa menunggu maksimum?
  • Adakah aktiviti merupakan fungsi, kontena, atau perkhidmatan HTTP luaran, dan kesan sampingan manakah yang tidak boleh diundur (irreversible)?
  • Bagaimanakah pelulus disahkan (authenticated), dibenarkan (authorized), dan diganti? Adakah kelulusan kuorum diperlukan?
  • Bolehkah percubaan semula mengulangi sesuatu aktiviti, dan bolehkah perkhidmatan perniagaan menerima kunci keidempotenan?
  • Bagaimanakah takrifan diterbitkan, dibekukan, dan dimigrasikan? Adakah tika (instances) yang sedang berjalan mengikut versi baharu?
  • Apakah medan audit yang mesti dikekalkan, dan siapa yang boleh membaca atau mengubahnya?
  • Adakah pembatalan, jeda, percubaan semula manual, atau melangkau langkah merupakan operasi produk yang normal?

Rangka kerja jawapan 30 saat

“Saya akan memodelkan aliran kerja sebagai mesin keadaan tahan lasak (durable state machine): menyimpan versi takrifan, larian (runs), percubaan aktiviti, log peristiwa, dan syot kilat semasa secara berasingan. Penjadual menghantar tugas aktiviti yang boleh dicuba semula; pekerja melaporkan hasil dengan ID aktiviti, percubaan, dan kunci keidempotenan, dan mesin keadaan menyahduplikasi mereka. Kelulusan manusia mendapat token guna sekali jangka pendek yang terikat pada larian, langkah, penyewa, dan versi kelulusan. Pemasa, had masa tamat, dan pembatalan adalah peristiwa tahan lasak. Saya akan menskalakannya dengan baris gilir berpartition dan kuota penyewa, kemudian mengesahkan pemulihan dengan memainkan semula (replay), audit, dan suntikan kerosakan (fault injection).”

Jawapan langkah demi langkah

Takrifkan model pelaksanaan terlebih dahulu. Takrifan aliran kerja ialah versi tak boleh ubah (immutable) yang mengandungi jenis langkah, pemetaan input, had masa tamat, dasar percubaan semula, dan peraturan pampasan. Sesuatu larian merujuk satu versi yang dibekukan, jadi menerbitkan takrifan baharu tidak akan menulis semula sejarah secara senyap. Bina semula keadaan daripada log peristiwa tambah sahaja (append-only); gunakan syot kilat untuk mempercepatkan bacaan. Penambahan peristiwa memerlukan syarat jujukan atau versi supaya penulis yang serentak tidak boleh menulis ganti satu sama lain.

Jangan panggil perkhidmatan luaran di dalam transaksi pangkalan data. Lakukan komit peristiwa ActivityScheduled, biarkan penjadual memasukkan tugas ke dalam baris gilir, minta pekerja memperoleh pajakan (lease) dan memanggil perkhidmatan tersebut, kemudian komit ActivitySucceeded, ActivityFailed, atau ActivityTimedOut. Terima hasil hanya untuk larian, langkah, dan percubaan yang dijangkakan. Hasil yang lewat atau pendua adalah bukti audit, bukan peralihan keadaan.

Model keadaan minimum adalah:

EntitiMedan utamaTujuan
DefinitionVersiontenant, definition, version, digestMembekukan langkah dan dasar
WorkflowRunrun, definitionVersion, status, sequenceMenjejaki sesuatu tika
Eventrun, sequence, type, payload, createdAtFakta dan main semula (replay)
ActivityAttemptstep, attempt, lease, idempotencyKey, statusPenghantaran, pajakan, hasil
Approvalstep, tokenHash, approver, expiresAt, statusKelayakan kelulusan manusia
Timerrun, step, fireAt, generation, statusBangun tidur, kelewatan, had masa tamat

Penghantaran adalah sekurang-kurangnya sekali (at least once); perakuan baris gilir (queue acknowledgement) bukanlah penyiapan perniagaan. Mesej membawa ID larian, ID langkah, percubaan, versi takrifan, dan kunci keidempotenan. Pajakan menghalang dua pengguna (consumers) daripada bekerja serentak, manakala token pemagaran (fencing token) atau penulisan bersyarat menolak pekerja yang lapuk (stale). Luput pajakan membenarkan penghantaran semula, tetapi kesan luaran pendua bergantung pada kontrak aktiviti.

Kendalikan keidempotenan pada beberapa lapisan. Peristiwa mesin keadaan menggunakan kunci (run, sequence) yang unik. Hasil aktiviti menggunakan (run, step, idempotencyKey). Pembayaran, e-mel, atau penulisan ke perkhidmatan perniagaan mesti menerima kunci yang sama atau menguatkuasakan kekangan keunikan perniagaan. Jika panggilan berjaya dan respons hilang, percubaan semula mesti mengembalikan hasil yang telah selesai atau pendua yang selamat. Jangan mendakwa berlaku tepat sekali (exactly once) dari hujung ke hujung. Untuk kesan yang tidak idempoten, gunakan semakan manusia, pampasan, atau dasar tanpa percubaan semula.

URL kelulusan bukanlah kebenaran (authorization). Hasilkan bahan rawak berentropi tinggi, simpan hanya cincangannya (hash), dan ikat token tersebut pada penyewa, larian, langkah, tindakan, dan tarikh luput. Pada panggilan balik, sahkan token, tandatangan atau identiti log masuk, perlindungan CSRF, keadaan guna sekali, dan langkah aliran kerja semasa. Semak semula kebenaran pelulus pada masa penyerahan. Kelulusan dan penolakan menjadi peristiwa audit kalis gangguan (tamper-evident); panggilan balik yang telah luput adalah tidak sah.

Kekalkan pemasa secara tahan lasak. Simpan fireAt dan penjanaan (generation) apabila mencipta had masa tamat atau waktu menunggu. Penjadual mengimbas indeks masa atau baldi (bucket), menuntut pemasa yang matang dengan kemas kini bersyarat, dan menyahduplikasi ulangan dengan syarat penjanaan dan keadaan. But semula pulih daripada storan. Menyelesaikan kelulusan atau pembatalan menandakan pemasa lama sebagai usang; tidur dalam memori (in-memory sleep) tidak boleh memegang pekerja selama berhari-hari.

Pembatalan, jeda, dan pembaikan adalah arahan mesin keadaan yang eksplisit. Pembatalan merekodkan niat dan menghalang kerja yang belum dimulakan; kesan luaran yang sedang berjalan tidak boleh dibatalkan secara magis, jadi tunggu hasilnya atau jalankan pampasan. Pelangkauan oleh admin, percubaan semula, dan pengeditan input memerlukan kebenaran, alasan, keadaan lama, keadaan baharu, dan peristiwa audit. Jangan sekali-kali mengedit syot kilat secara langsung, atau main semula akan menghasilkan keputusan yang berbeza.

Asingkan versi bagi setiap larian. Takrifan baharu mendapat digest baharu; larian sedia ada mengekalkan versi lama secara lalai. Migrasi mesti mentakrifkan keadaan dan input yang serasi, memperoleh sebarang kelulusan yang diperlukan, dan menambah peristiwa WorkflowMigrated dengan kedua-dua versi. Pekerja hanya menerima versi takrifan yang mereka laksanakan, menghalang tugas lama daripada memajukan mesin keadaan baharu secara tidak betul.

Skalakan dengan memecahkan bahagian (partitioning) mengikut penyewa atau ID larian. Berikan kuota keserentakan kepada penyewa yang aktif (hot tenants) dan asingkan kumpulan pekerja mengikut jenis aktiviti dan keutamaan. Tambah peristiwa pada storan berpartition, simpan syot kilat dan indeks dalam pangkalan data dalam talian, enkrip muatan sensitif, dan kuat kuasakan pengekalan. Tambah tekanan belakang (backpressure), surat mati (dead letters), metrik pajakan, dan had kadar supaya satu aliran kerja yang tidak terkawal tidak menggunakan kapasiti global.

Kebolehcerapan mesti berkhidmat untuk operator masa jalan (runtime) dan perniagaan. Rekodkan langkah semasa, alasan menunggu, percubaan, kelewatan baris gilir, kelewatan pemasa, masa terbiar kelulusan, amplifikasi percubaan semula, hasil pampasan, dan versi. Jejak boleh membawa pengecam larian, langkah, dan percubaan, manakala input sensitif kekal dalam storan audit terkawal. Paparan operasi harus menjelaskan tindakan seterusnya; "menunggu" bukanlah "gagal."

Suntik kegagalan: ranap selepas komit peristiwa, mesej pendua, luput pajakan, aktiviti berjaya dengan respons yang hilang, kelulusan yang dimainkan semula, pemasa pendua, gangguan pangkalan data, tunggakan baris gilir, penggunaan versi yang terganggu, dan kuota penyewa yang habis. Tentukan hasil yang boleh diperhatikan: keadaan lama tidak berundur, kesan sampingan tidak diulang tanpa kontrak, token tidak boleh digunakan dua kali, dan pemulihan akhirnya berterusan atau memasuki keadaan manusia yang eksplisit.

Contoh jawapan berkualiti tinggi

“Saya akan membina mesin keadaan tahan lasak daripada membiarkan pekerja mengingati keadaan aliran kerja. Versi takrifan adalah tidak boleh ubah dan setiap larian menyematkan satu versi; log peristiwa ialah sumber fakta dan syot kilat mempercepatkan bacaan. Mesin keadaan melakukan komit peristiwa penjadualan, baris gilir menghantar sekurang-kurangnya sekali, dan pekerja melaporkan dengan larian, langkah, percubaan, dan kunci keidempotenan. Hasil pendua atau lapuk adalah entri audit, bukan peralihan yang tidak sah.

Kelulusan mencipta token guna sekali yang terikat pada penyewa, larian, langkah, dan tindakan; hanya cincangannya disimpan dan ia mempunyai tarikh luput. Panggilan balik menyemak identiti, kebenaran, CSRF, keadaan token, dan langkah semasa, kemudian menggunakan token tersebut secara bersyarat dan menambah peristiwa audit. Kelulusan, penolakan, had masa tamat, dan pembatalan adalah peristiwa, bukan pengeditan syot kilat secara langsung.

Pemasa mengekalkan fireAt dan penjanaan. Penjadual berbaldi menuntutnya dengan penulisan bersyarat; but semula memulihkannya dan pencetusan pendua dinyahduplikasi. Pajakan menghalang pekerja serentak dan token pemagaran menolak penulisan yang lapuk. Pembayaran atau e-mel tanpa kontrak keidempotenan hiliran yang terbukti tidak boleh tepat sekali; gunakan kunci hiliran, keunikan, pampasan, atau pengendalian manusia.

Larian tidak mengikut takrifan baharu secara senyap; migrasi menambah peristiwa dengan kedua-dua versi. Buat partition mengikut penyewa dan larian, asingkan kuota penyewa aktif, dan gunakan kumpulan pekerja mengikut jenis aktiviti. Lapiskan peristiwa tambah sahaja, syot kilat dalam talian, data audit yang dienkripsi, dan pengekalan. Suntikan kerosakan mesti merangkumi ranap sistem, penghantaran semula, respons yang hilang, main semula panggilan balik, pemasa pendua, dan penggunaan versi yang terganggu.”

Kesilapan lazim

  • Menganggap perakuan baris gilir sebagai penyiapan → pekerja mungkin ranap selepas kesan berlaku dan menerima mesej itu semula → nyahduplikasi dengan keadaan tahan lasak dan hasil yang idempoten.
  • Mendakwa tepat sekali (exactly once) → transaksi tempatan tidak dapat menjamin kesan sampingan teragih → nyatakan penghantaran sekurang-kurangnya sekali dan keidempotenan hiliran, pampasan, atau pengendalian manusia.
  • Menganggap URL kelulusan sebagai kebenaran → kebocoran atau main semula boleh memberikan akses → ikat identiti, penyewa, langkah, tindakan, tarikh luput, dan keadaan guna sekali.
  • Tidur dalam memori (sleep in memory) selama berhari-hari → but semula dan penskalaan menghilangkan masa menunggu → kekalkan pemasa dan bangunkan melalui penjadual.
  • Mengedit syot kilat secara langsung → main semula menghasilkan keputusan yang berbeza → gunakan arahan mesin keadaan dan peristiwa audit yang dibenarkan.
  • Berkongsi satu baris gilir merentas penyewa → penyewa yang aktif menyebabkan penyewa lain kelaparan sumber (starvation) → buat partition, kuota, utamakan, dan gunakan tekanan belakang.
  • Membiarkan takrifan baharu mempengaruhi larian lama → aliran kerja yang sedang berjalan menjadi tidak dapat dijelaskan → sematkan versi dan jadikan migrasi eksplisit.

Soalan dan jawapan susulan

Susulan 1: Aktiviti berjaya tetapi pekerja ranap sebelum menulis hasilnya. Bolehkah percubaan semula mengenakan caj dua kali?

Jika perkhidmatan hiliran menyokong kunci keidempotenan, cuba semula dengan kunci yang sama dan petakan hasil yang telah selesai. Jika tidak, jangan cuba semula secara membuta tuli: buat pertanyaan keadaan hiliran, masukkan pengendalian manusia, atau lakukan pampasan. Mesin keadaan boleh menjadikan peristiwanya sendiri konsisten, tetapi ia tidak dapat mencipta semantik pembayaran tepat sekali dengan sendirinya.

Susulan 2: Pelulus mengklik lulus sebanyak dua kali. Apa yang berlaku?

Benarkan satu penggunaan token yang berjaya dengan kemas kini bersyarat atau kekangan unik daripada pending kepada approved. Permintaan kedua mengembalikan respons sudah dikendalikan atau luput dan tidak memajukan aliran kerja. Kedua-dua permintaan dan identiti kekal dalam jejak audit.

Susulan 3: Bagaimanakah anda menyokong "mana-mana dua pelulus"?

Kekalkan peti masuk kelulusan dan versi dasar. Rekodkan satu keputusan yang telah dinyahduplikasi bagi setiap pelulus, termasuk syot kilat kebenaran. Maju hanya apabila kuorum dicapai; penolakan, pembatalan, dan penggantian pelulus adalah arahan yang eksplisit.

Susulan 4: Operator perlu melangkau langkah dengan segera. Apakah laluan yang selamat?

Takrifkan peranan yang dibenarkan, langkah yang boleh dilangkau, dan syarat keselamatan terlebih dahulu. Keluarkan arahan StepSkipped yang beralasan berserta keadaan lama, keadaan baharu, operator, dan kelulusan. Jika melangkau melanggar invarian perniagaan, tolaknya dan tawarkan pampasan atau penamatan dan bukannya mengedit pangkalan data.

Susulan 5: Bagaimanakah anda menghalang penyewa daripada mencipta aliran kerja yang tidak terhad?

Hadkan langkah, kedalaman cawangan, keserentakan aktiviti, saiz sejarah, bilangan pemasa, dan jumlah masa jalan bagi setiap penyewa. Sahkan takrifan secara statik dan ukur pelaksanaannya. Melebihi kuota akan menjeda atau menolak kerja dengan alasan yang dapat dilihat oleh operator daripada membenarkan pertumbuhan tanpa had.

Sumber awam

Soalan berkaitan

Alat temu duga berkaitan

Gunakan Jawab untuk jawapan reka bentuk sistem

Jelaskan keperluan terlebih dahulu, kemudian teruskan dengan skala, seni bina, pilihan komponen dan pertukaran (trade-off).

Lihat alat