Jadual Kandungan
1 Pengenalan
2. Acara Kluster
四、如何实现端口共享
五、如何将请求分发到多个worker
六、pm2 工作原理
七、总结
Rumah hujung hadapan web tutorial js Ajar anda langkah demi langkah cara menggunakan kluster dalam Node

Ajar anda langkah demi langkah cara menggunakan kluster dalam Node

Dec 27, 2021 pm 07:15 PM
node kelompok

Artikel ini akan membawa anda untuk mengetahui lebih lanjut tentang kluster dalam Node.js dan memperkenalkan acara kluster saya harap ia akan membantu semua orang.

Ajar anda langkah demi langkah cara menggunakan kluster dalam Node

1 Pengenalan

Nod Dalam v0.8, modul kluster telah diperkenalkan secara langsung kepada Ia. menyelesaikan masalah penggunaan CPU berbilang teras dan juga menyediakan API yang agak lengkap untuk menangani keteguhan proses.

Modul kluster memanggil kaedah fork untuk mencipta proses anak, iaitu kaedah yang sama seperti fork dalam child_process. Modul kluster menggunakan model induk-hamba klasik Kluster akan mencipta induk dan kemudian menyalin berbilang proses anak mengikut nombor yang anda tentukan. Anda boleh menggunakan sifat kluster.isMaster untuk menentukan sama ada proses semasa ialah induk atau pekerja (proses pekerja). Proses induk menguruskan semua sub-proses Proses induk tidak bertanggungjawab untuk pemprosesan tugas tertentu.

Modul kelompok menggunakan pengimbangan beban terbina dalam untuk mengendalikan tekanan antara benang dengan lebih baik Pengimbangan beban menggunakan algoritma Round-robin (juga dikenali sebagai algoritma round-robin). Apabila menggunakan strategi penjadualan Round-robin, induk menerima() semua permintaan sambungan masuk dan kemudian menghantar pemprosesan permintaan TCP yang sepadan kepada proses pekerja yang dipilih (kaedah ini masih berkomunikasi melalui IPC). Contoh penggunaan rasmi adalah seperti berikut

const cluster = require('cluster');
const cpuNums = require('os').cpus().length;
const http = require('http');

if (cluster.isMaster) {
  for (let i = 0; i < cpuNums; i++){
    cluster.fork();
  }
  // 子进程退出监听
  cluster.on(&#39;exit&#39;, (worker,code,signal) => {
    console.log(&#39;worker process died,id&#39;,worker.process.pid)
  })
} else {
  // 给子进程标注进程名
  process.title = `cluster 子进程 ${process.pid}`;
  // Worker可以共享同一个 TCP 连接,这里是一个 http 服务器
  http.createServer((req, res)=> {
    res.end(`response from worker ${process.pid}`);
  }).listen(3000);
  console.log(`Worker ${process.pid} started`);
}
Salin selepas log masuk

Malah, modul kluster digunakan oleh gabungan modul child_process dan net Apabila kluster bermula, pelayan TCP akan dimulakan secara dalaman. proses anak fork(), pelayan TCP akan dimulakan secara dalaman Deskriptor fail soket bahagian pelayan TCP ini dihantar ke proses pekerja. Jika proses pekerja disalin melalui cluster.fork(), maka NODE_UNIQUE_ID wujud dalam pembolehubah persekitarannya Jika terdapat panggilan listen() untuk mendengar port rangkaian dalam proses pekerja, ia akan mendapat deskriptor fail dan lulus SO_REUSEADDR. port. Guna semula, dengan itu membolehkan berbilang proses kanak-kanak untuk berkongsi port.

2. Acara Kluster

  • garpu: Acara ini dicetuskan selepas menyalin proses pekerja; 🎜 >dalam talian: Selepas menyalin proses kerja, proses kerja secara aktif menghantar mesej dalam talian ke proses utama Selepas proses utama menerima mesej, acara dicetuskan; dipanggil dalam proses kerja Selepas mendengar() (Soket bahagian pelayan dikongsi), mesej mendengar dihantar ke proses utama Selepas proses utama menerima mesej, acara dicetuskan; >

    putus sambungan: proses utama dan proses pekerja Peristiwa ini akan dicetuskan apabila saluran IPC diputuskan sambungannya; >
  • persediaan: Peristiwa ini dicetuskan selepas cluster.setupMaster() dilaksanakan; , dan dikapsulkan berdasarkan penghantaran mesej antara proses.

  • 3. Komunikasi antara tuan dan pekerja

  • Seperti yang dapat dilihat daripada di atas, proses induk mencipta proses pekerja melalui cluster.fork(In hakikatnya, cluster.fork( ) secara dalaman mencipta proses anak melalui child_process.fork(). Maksudnya: proses induk dan pekerja adalah proses ibu bapa dan anak; mereka berkomunikasi melalui saluran IPC sama seperti proses ibu bapa-anak yang dicipta oleh child_process.

    Nama penuh IPC ialah Komunikasi Antara Proses, iaitu komunikasi antara proses Tujuan komunikasi antara proses adalah untuk membolehkan proses yang berbeza mengakses sumber dan menyelaraskan kerja antara satu sama lain. Saluran IPC dalam Node dilaksanakan oleh teknologi paip Pelaksanaan khusus disediakan oleh libuv Ia dilaksanakan oleh paip bernama di bawah sistem Windows. Komunikasi antara proses yang dilaksanakan pada lapisan aplikasi hanya mempunyai acara mesej dan kaedah penghantaran yang mudah, yang sangat mudah digunakan.
  • Proses induk akan mencipta saluran IPC dan mendengarnya sebelum benar-benar mencipta proses kanak-kanak, dan kemudian sebenarnya mencipta proses kanak-kanak dan memberitahu proses kanak-kanak melalui pembolehubah persekitaran (NODE_CHANNEL_FD) Deskriptor fail untuk saluran IPC ini. Semasa proses permulaan, proses anak bersambung ke saluran IPC sedia ada mengikut deskriptor fail, dengan itu melengkapkan sambungan antara proses ibu bapa dan anak.
Selepas sambungan diwujudkan, proses ibu bapa dan anak boleh berkomunikasi dengan bebas. Oleh kerana saluran IPC dicipta menggunakan Paip Dinamakan atau Soket Domain, ia berkelakuan serupa dengan soket rangkaian dan merupakan komunikasi dua hala. Perbezaannya ialah mereka melengkapkan komunikasi antara proses dalam kernel sistem tanpa melalui lapisan rangkaian sebenar, yang sangat cekap. Dalam Node, saluran IPC diabstraksikan sebagai objek Stream Apabila hantar dipanggil, data dihantar (serupa dengan write ), dan mesej yang diterima dicetuskan ke lapisan aplikasi melalui peristiwa mesej (serupa dengan data ).

master 和 worker 进程在 server 实例的创建过程中,是通过 IPC 通道进行通信的,那会不会对我们的开发造成干扰呢?比如,收到一堆其实并不需要关心的消息?答案肯定是不会?那么是怎么做到的呢?

Node 引入进程间发送句柄的功能,send 方法除了能通过 IPC 发送数据外,还能发送句柄,第二个参数为句柄,如下所示

child.send(meeage, [sendHandle])
Salin selepas log masuk

句柄是一种可以用来标识资源的引用,它的内部包含了指向对象的文件描述符。例如句柄可以用来标识一个服务器端 socket 对象、一个客户端 socket 对象、一个 UDP 套接字、一个管道等。 那么句柄发送跟我们直接将服务器对象发送给子进程有没有什么差别?它是否真的将服务器对象发送给子进程?

其实 send() 方法在将消息发送到 IPC 管道前,将消息组装成两个对象,一个参数是 handle,另一个是 message,message 参数如下所示

{
  cmd: &#39;NODE_HANDLE&#39;,
  type: &#39;net.Server&#39;,
  msg: message
}
Salin selepas log masuk

发送到 IPC 管道中的实际上是要发送的句柄文件描述符,其为一个整数值。这个 message 对象在写入到 IPC 管道时会通过 JSON.stringify 进行序列化,转化为字符串。子进程通过连接 IPC 通道读取父进程发送来的消息,将字符串通过 JSON.parse 解析还原为对象后,才触发 message 事件将消息体传递给应用层使用。在这个过程中,消息对象还要被进行过滤处理,message.cmd 的值如果以 NODE_ 为前缀,它将响应一个内部事件 internalMessage ,如果 message.cmd 值为 NODE_HANDLE,它将取出 message.type 值和得到的文件描述符一起还原出一个对应的对象。这个过程的示意图如下所示

Ajar anda langkah demi langkah cara menggunakan kluster dalam Node

在 cluster 中,以 worker 进程通知 master 进程创建 server 实例为例子。worker 伪代码如下:

// woker进程
const message = {
  cmd: &#39;NODE_CLUSTER&#39;,
  type: &#39;net.Server&#39;,
  msg: message
};
process.send(message);
Salin selepas log masuk

master 伪代码如下:

worker.process.on(&#39;internalMessage&#39;, fn);
Salin selepas log masuk

四、如何实现端口共享

在前面的例子中,多个 woker 中创建的 server 监听了同个端口 3000,通常来说,多个进程监听同个端口,系统会报 EADDRINUSE 异常。为什么 cluster 没问题呢?

因为独立启动的进程中,TCP 服务器端 socket 套接字的文件描述符并不相同,导致监听到相同的端口时会抛出异常。但对于 send() 发送的句柄还原出来的服务而言,它们的文件描述符是相同的,所以监听相同端口不会引起异常。

这里需要注意的是,多个应用监听相同端口时,文件描述符同一时间只能被某个进程所用,换言之就是网络请求向服务器端发送时,只有一个幸运的进程能够抢到连接,也就是说只有它能为这个请求进行服务,这些进程服务是抢占式的。

五、如何将请求分发到多个worker

  • 每当 worker 进程创建 server 实例来监听请求,都会通过 IPC 通道,在 master 上进行注册。当客户端请求到达,master 会负责将请求转发给对应的 worker;
  • 具体转发给哪个 worker?这是由转发策略决定的,可以通过环境变量 NODE_CLUSTER_SCHED_POLICY 设置,也可以在 cluster.setupMaster(options) 时传入,默认的转发策略是轮询(SCHED_RR);
  • 当有客户请求到达,master 会轮询一遍 worker 列表,找到第一个空闲的 worker,然后将该请求转发给该worker;

六、pm2 工作原理

pm2 是 node 进程管理工具,可以利用它来简化很多 node 应用管理的繁琐任务,如性能监控、自动重启、负载均衡等。

pm2 自身是基于 cluster 模块进行封装的, 本节我们主要 pm2 的 Satan 进程、God Daemon 守护进程 以及两者之间的进程间远程调用 RPC。

撒旦(Satan),主要指《圣经》中的堕天使(也称堕天使撒旦),被看作与上帝的力量相对的邪恶、黑暗之源,是God 的对立面。

Ajar anda langkah demi langkah cara menggunakan kluster dalam Node

其中 Satan.js 提供程序的退出、杀死等方法,God.js 负责维持进程的正常运行,God 进程启动后一直运行,相当于 cluster 中的 Master进程,维持 worker 进程的正常运行。

RPC(Remote Procedure Call Protocol)是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A 服务器上,想要调用 B 服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。同一机器不同进程间的方法调用也属于 rpc 的作用范畴。 执行流程如下所示

Ajar anda langkah demi langkah cara menggunakan kluster dalam Node

每次命令行的输入都会执行一次 satan 程序,如果 God 进程不在运行,首先需要启动 God 进程。然后根据指令,Satan 通过 rpc 调用 God 中对应的方法执行相应的逻辑。

pm2 start app.js -i 4 为例,God 在初次执行时会配置 cluster,同时监听 cluster 中的事件:

// 配置cluster
cluster.setupMaster({
  exec : path.resolve(path.dirname(module.filename), &#39;ProcessContainer.js&#39;)
});

// 监听cluster事件
(function initEngine() {
  cluster.on(&#39;online&#39;, function(clu) {
    // worker进程在执行
    God.clusters_db[clu.pm_id].status = &#39;online&#39;;
  });
  
  // 命令行中 kill pid 会触发exit事件,process.kill不会触发exit
  cluster.on(&#39;exit&#39;, function(clu, code, signal) {
    // 重启进程 如果重启次数过于频繁直接标注为stopped
    God.clusters_db[clu.pm_id].status = &#39;starting&#39;;
    // 逻辑
    // ...
  });
})();
Salin selepas log masuk

在 God 启动后, 会建立 Satan 和 God 的rpc链接,然后调用 prepare 方法,prepare 方法会调用 cluster.fork 来完成集群的启动

God.prepare = function(opts, cb) {
  // ...
  return execute(opts, cb);
};

function execute(env, cb) {
  // ...
  var clu = cluster.fork(env);
  // ...
  God.clusters_db[id] = clu;
  
  clu.once(&#39;online&#39;, function() {
    God.clusters_db[id].status = &#39;online&#39;;
    if (cb) return cb(null, clu);
    return true;
  });
  return clu;
}
Salin selepas log masuk

七、总结

本文从 cluster 的基本使用、事件,到 cluster 的基本实现原理,再到  pm2 如何基于 cluster 进行进程管理,带你从入门到深入原理以及了解其高阶应用,希望对你有帮助。

更多node相关知识,请访问:nodejs 教程!!

Atas ialah kandungan terperinci Ajar anda langkah demi langkah cara menggunakan kluster dalam Node. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk memadam nod dalam nvm Bagaimana untuk memadam nod dalam nvm Dec 29, 2022 am 10:07 AM

Cara memadam nod dengan nvm: 1. Muat turun "nvm-setup.zip" dan pasangkannya pada pemacu C 2. Konfigurasikan pembolehubah persekitaran dan semak nombor versi melalui arahan "nvm -v" 3. Gunakan "nvm arahan install" Pasang nod; 4. Padamkan nod yang dipasang melalui arahan "nvm uninstall".

Cara menggunakan ekspres untuk mengendalikan muat naik fail dalam projek nod Cara menggunakan ekspres untuk mengendalikan muat naik fail dalam projek nod Mar 28, 2023 pm 07:28 PM

Bagaimana untuk mengendalikan muat naik fail? Artikel berikut akan memperkenalkan kepada anda cara menggunakan ekspres untuk mengendalikan muat naik fail dalam projek nod saya harap ia akan membantu anda!

Analisis mendalam tentang alat pengurusan proses Node 'pm2' Analisis mendalam tentang alat pengurusan proses Node 'pm2' Apr 03, 2023 pm 06:02 PM

Artikel ini akan berkongsi dengan anda alat pengurusan proses Node "pm2", dan bercakap tentang mengapa pm2 diperlukan, cara memasang dan menggunakan pm2, saya harap ia akan membantu semua orang!

PI Node Teaching: Apakah nod pi? Bagaimana cara memasang dan menyediakan nod pi? PI Node Teaching: Apakah nod pi? Bagaimana cara memasang dan menyediakan nod pi? Mar 05, 2025 pm 05:57 PM

Penjelasan dan Panduan Pemasangan Terperinci untuk Pinetwork Nodes Artikel ini akan memperkenalkan ekosistem pinetwork secara terperinci - nod pi, peranan utama dalam ekosistem pinetwork, dan menyediakan langkah -langkah lengkap untuk pemasangan dan konfigurasi. Selepas pelancaran Rangkaian Ujian Blockchain Pinetwork, nod PI telah menjadi bahagian penting dari banyak perintis yang aktif mengambil bahagian dalam ujian, bersiap sedia untuk pelepasan rangkaian utama yang akan datang. Jika anda tidak tahu kerja pinet, sila rujuk apa itu picoin? Berapakah harga untuk penyenaraian? Penggunaan PI, perlombongan dan analisis keselamatan. Apa itu Pinetwork? Projek Pinetwork bermula pada tahun 2019 dan memiliki syiling pi cryptocurrency eksklusifnya. Projek ini bertujuan untuk mewujudkan satu yang semua orang boleh mengambil bahagian

Mari kita bincangkan tentang cara menggunakan pkg untuk membungkus projek Node.js ke dalam fail boleh laku. Mari kita bincangkan tentang cara menggunakan pkg untuk membungkus projek Node.js ke dalam fail boleh laku. Dec 02, 2022 pm 09:06 PM

Bagaimana untuk membungkus fail boleh laku nodejs dengan pkg? Artikel berikut akan memperkenalkan kepada anda cara menggunakan pkg untuk membungkus projek Node ke dalam fail boleh laku. Saya harap ia akan membantu anda!

Node berpindah sepenuhnya daripada Proxmox VE dan menyertai semula kluster Node berpindah sepenuhnya daripada Proxmox VE dan menyertai semula kluster Feb 21, 2024 pm 12:40 PM

Perihalan senario untuk nod mengosongkan sepenuhnya daripada ProxmoxVE dan menyertai semula kluster Apabila nod dalam kluster ProxmoxVE rosak dan tidak boleh dibaiki dengan cepat, nod yang rosak perlu ditendang keluar dari kluster dengan bersih dan maklumat baki mesti dibersihkan. Jika tidak, nod baharu yang menggunakan alamat IP yang digunakan oleh nod yang rosak tidak akan dapat menyertai kluster secara normal, selepas nod rosak yang telah dipisahkan daripada kluster dibaiki, walaupun ia tidak ada kaitan dengan kluster, ia akan; tidak dapat mengakses pengurusan web nod tunggal ini Di latar belakang, maklumat tentang nod lain dalam kelompok ProxmoxVE asal akan muncul, yang sangat menjengkelkan. Usir nod daripada kluster Jika ProxmoxVE ialah kluster hiper-tumpu Ceph, anda perlu log masuk ke mana-mana nod dalam kluster (kecuali nod yang anda mahu padamkan) pada sistem hos Debian, dan jalankan arahan

Apa yang perlu dilakukan jika npm nod gyp gagal Apa yang perlu dilakukan jika npm nod gyp gagal Dec 29, 2022 pm 02:42 PM

npm node gyp gagal kerana versi "node-gyp.js" dan "Node.js" tidak sepadan Penyelesaiannya: 1. Kosongkan cache nod melalui "npm cache clean -f" 2. Melalui "npm install -. g n" Pasang modul n; 3. Pasang versi "nod v12.21.0" melalui arahan "n v12.21.0".

Pengesahan berasaskan token dengan Angular dan Node Pengesahan berasaskan token dengan Angular dan Node Sep 01, 2023 pm 02:01 PM

Pengesahan adalah salah satu bahagian terpenting dalam mana-mana aplikasi web. Tutorial ini membincangkan sistem pengesahan berasaskan token dan cara ia berbeza daripada sistem log masuk tradisional. Pada penghujung tutorial ini, anda akan melihat demo berfungsi sepenuhnya yang ditulis dalam Angular dan Node.js. Sistem Pengesahan Tradisional Sebelum beralih kepada sistem pengesahan berasaskan token, mari kita lihat sistem pengesahan tradisional. Pengguna memberikan nama pengguna dan kata laluan mereka dalam borang log masuk dan klik Log Masuk. Selepas membuat permintaan, sahkan pengguna di bahagian belakang dengan menanyakan pangkalan data. Jika permintaan itu sah, sesi dibuat menggunakan maklumat pengguna yang diperoleh daripada pangkalan data dan maklumat sesi dikembalikan dalam pengepala respons supaya ID sesi disimpan dalam penyemak imbas. Menyediakan akses kepada aplikasi tertakluk kepada

See all articles