Artikel ini akan membawa anda melalui mekanisme pemutus litar dalam Node.js saya harap ia akan membantu anda!
Apabila kami menggunakan seni bina CS tradisional, pelayan menyekat permintaan disebabkan kegagalan dan sebab lain, yang mungkin menyebabkan pelanggan permintaan pelanggan kehilangan respons, menyebabkan sekumpulan pengguna tidak dapat mendapatkan perkhidmatan selepas satu tempoh masa. Kesan yang mungkin daripada keadaan ini adalah terhad dan boleh dianggarkan.
Walau bagaimanapun, dalam sistem perkhidmatan mikro, pelayan anda mungkin bergantung pada beberapa perkhidmatan mikro lain dan perkhidmatan mikro ini bergantung pada lebih banyak perkhidmatan mikro lain Dalam kes ini, perkhidmatan tertentu boleh menyebabkan kesesakan hiliran keseluruhan pautan disebabkan oleh penggunaan sumber yang melata dalam sekelip mata (dalam beberapa saat), yang kami panggil "perkhidmatan runtuh". [Pembelajaran yang disyorkan: "tutorial nodejs"]
Mod fius: Seperti namanya, sama seperti litar rumah, jika voltan talian terlalu tinggi, fius akan bertiup untuk mengelakkan kebakaran. Dalam sistem yang menggunakan mod pemutus litar, jika didapati panggilan perkhidmatan huluan lambat atau terdapat banyak masa tamat, panggilan ke perkhidmatan akan ditamatkan terus, maklumat akan dikembalikan terus dan sumber akan dikeluarkan. dengan cepat. Panggilan tidak akan disambung semula sehingga perkhidmatan huluan bertambah baik.
Kewujudan pemutus litar adalah bersamaan dengan memberi kita lapisan perlindungan Apabila kestabilan panggilan tidak baik, atau panggilan berkemungkinan gagal, Untuk perkhidmatan dan sumber, pemutus litar boleh memantau ralat ini dan gagal permintaan selepas mencapai ambang tertentu untuk mengelakkan penggunaan sumber yang berlebihan. Di samping itu, pemutus litar juga mempunyai fungsi mengenal pasti secara automatik status perkhidmatan dan memulihkannya Apabila perkhidmatan huluan kembali normal, pemutus litar boleh secara automatik menentukan dan menyambung semula permintaan biasa.
Mari kita lihat proses permintaan tanpa pemutus litar: Pengguna bergantung pada ServiceA untuk menyediakan perkhidmatan, dan ServiceA bergantung pada perkhidmatan yang disediakan oleh ServiceB. Andaikan ServiceB gagal dalam masa 10 minit , untuk setiap permintaan Akan ada kelewatan 10 saat sebagai balasan.
Andaikan kami mempunyai N Pengguna yang meminta perkhidmatan ServiceA dalam beberapa saat, sumber ServiceA akan digunakan kerana permintaan kepada ServiceB digantung, dengan itu menolak sebarang permintaan seterusnya daripada Pengguna. Bagi pengguna, ini bermakna kedua-dua ServiceA dan ServiceB gagal pada masa yang sama, menyebabkan keseluruhan pautan perkhidmatan runtuh.
Dan apakah yang berlaku apabila kami memasang pemutus litar pada ServiceA?
Selepas bilangan kegagalan mencapai ambang tertentu, pemutus litar akan mendapati permintaan kepada ServiceB tidak sah Pada masa ini, ServiceA tidak perlu meneruskan permintaan ServiceB, tetapi terus mengembalikan kegagalan, atau Gunakan data sandaran daripada Fallback lain. Pada masa ini, pemutus litar berada dalam keadaan litar terbuka.
Selepas tempoh masa, pemutus litar akan mula bertanya secara berkala sama ada ServiceB telah dipulihkan Pada masa ini, pemutus litar berada dalam separuh terbuka negeri.
Jika ServiceB telah dipulihkan, pemutus litar akan diletakkan dalam keadaan off Pada masa ini, ServiceA akan memanggil ServiceB seperti biasa dan mengembalikan hasilnya.
Rajah status pemutus litar adalah seperti berikut:
Ia boleh dilihat bahawa pemutus litar Beberapa titik teras adalah seperti berikut:
Tamat masa: berapa lama permintaan bertahan sebelum ia menyebabkan kegagalan
Ambang kegagalan : iaitu, pemutus litar mencetuskan litar terbuka Sebelum ini, bilangan kegagalan yang perlu dicapai
Cuba semula tamat masa: Apabila pemutus litar berada dalam keadaan litar terbuka, berapa lama masa yang diambil untuk mencuba semula permintaan, iaitu, masukkan keadaan separuh terbuka
Dengan pengetahuan ini, Kita boleh cuba mencipta pemutus litar:
class CircuitBreaker { constructor(timeout, failureThreshold, retryTimePeriod) { // We start in a closed state hoping that everything is fine this.state = 'CLOSED'; // Number of failures we receive from the depended service before we change the state to 'OPEN' this.failureThreshold = failureThreshold; // Timeout for the API request. this.timeout = timeout; // Time period after which a fresh request be made to the dependent // service to check if service is up. this.retryTimePeriod = retryTimePeriod; this.lastFailureTime = null; this.failureCount = 0; } }
Membina mesin keadaan pemutus litar:
async call(urlToCall) { // Determine the current state of the circuit. this.setState(); switch (this.state) { case 'OPEN': // return cached response if no the circuit is in OPEN state return { data: 'this is stale response' }; // Make the API request if the circuit is not OPEN case 'HALF-OPEN': case 'CLOSED': try { const response = await axios({ url: urlToCall, timeout: this.timeout, method: 'get', }); // Yay!! the API responded fine. Lets reset everything. this.reset(); return response; } catch (err) { // Uh-oh!! the call still failed. Lets update that in our records. this.recordFailure(); throw new Error(err); } default: console.log('This state should never be reached'); return 'unexpected state in the state machine'; } }
Tambahkan fungsi yang tinggal:
// reset all the parameters to the initial state when circuit is initialized reset() { this.failureCount = 0; this.lastFailureTime = null; this.state = 'CLOSED'; } // Set the current state of our circuit breaker. setState() { if (this.failureCount > this.failureThreshold) { if ((Date.now() - this.lastFailureTime) > this.retryTimePeriod) { this.state = 'HALF-OPEN'; } else { this.state = 'OPEN'; } } else { this.state = 'CLOSED'; } } recordFailure() { this.failureCount += 1; this.lastFailureTime = Date.now(); }
Apabila menggunakan pemutus litar , hanya bungkus permintaan dalam kaedah Panggilan contoh pemutus litar dan panggilnya:
... const circuitBreaker = new CircuitBreaker(3000, 5, 2000); const response = await circuitBreaker.call('http://0.0.0.0:8000/flakycall');
Red Hat mencipta satu pelaksanaan pemutus litar Node.js yang sangat awal yang dinamakan Opossum, pautannya ada di sini: Opossum. Untuk sistem teragih, menggunakan pustaka ini boleh meningkatkan toleransi kesalahan perkhidmatan anda dan secara asasnya menyelesaikan masalah kegagalan perkhidmatan.
Alamat asal: https://juejin.cn/post/7019217344601948173
Pengarang: ES2049 / Looking for Singularity
Lebih lanjut pengetahuan berkaitan pengaturcaraan sila layari: Video Pengaturcaraan! !
Atas ialah kandungan terperinci Analisis mendalam tentang mekanisme pemutus litar dalam Node.js. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!