Rumah >hujung hadapan web >tutorial js >Analisis mendalam tentang mekanisme pemutus litar dalam Node.js

Analisis mendalam tentang mekanisme pemutus litar dalam Node.js

青灯夜游
青灯夜游ke hadapan
2021-10-18 09:53:552089semak imbas

Artikel ini akan membawa anda melalui mekanisme pemutus litar dalam Node.js saya harap ia akan membantu anda!

Analisis mendalam tentang mekanisme pemutus litar dalam Node.js

Masalah yang disebabkan oleh evolusi seni bina

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"]

Analisis mendalam tentang mekanisme pemutus litar dalam Node.js

Analisis mendalam tentang mekanisme pemutus litar dalam Node.js

Beberapa cara untuk menyelesaikan masalah

  • 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.

  • Mod pengasingan: Bahagikan panggilan untuk sumber atau perkhidmatan yang berbeza kepada beberapa kumpulan permintaan yang berbeza Kehabisan sumber dalam satu kumpulan tidak akan menjejaskan permintaan untuk sumber lain, menghalang satu titik sahaja. Ini adalah reka bentuk pemulihan bencana yang sangat tradisional.
  • Mod pengehad semasa: Pemutus litar dan pengasingan ialah kedua-dua kaedah pasca pemprosesan boleh mengurangkan kebarangkalian masalah sebelum ia berlaku. Mod pengehad semasa boleh menetapkan ambang QPS maksimum untuk permintaan untuk perkhidmatan tertentu Permintaan yang melebihi ambang dikembalikan secara langsung dan tidak lagi menduduki sumber untuk pemprosesan. Walau bagaimanapun, mod pengehad semasa tidak dapat menyelesaikan masalah keruntuhan perkhidmatan, kerana keruntuhan itu sering disebabkan bukan oleh bilangan permintaan yang besar, tetapi oleh penguatan berbilang lapisan lata.

Mekanisme dan pelaksanaan pemutus litar

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.

Analisis mendalam tentang mekanisme pemutus litar dalam Node.js

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.

Analisis mendalam tentang mekanisme pemutus litar dalam Node.js

Rajah status pemutus litar adalah seperti berikut:

Analisis mendalam tentang mekanisme pemutus litar dalam Node.js

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');

Perpustakaan pemutus litar Node.js Matang

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!

Kenyataan:
Artikel ini dikembalikan pada:juejin.cn. Jika ada pelanggaran, sila hubungi admin@php.cn Padam