上周,我深入实验了node.js应用程序中的聚类,并将分解核心概念(双关语意图)和可能的用例
nb:与以前的文章不同,我因此不再使用类比来代表技术,因为我了解到类比(或传达方式)可能因人而异。相反,我将专注于询问和回答有关技术的问题,以更好地将其专注于用例和能力。
为什么
流行的俗话说“一千英里的旅程从一步开始”,我们学习新事物的旅程始终以为单位 - 很像您的四个老侄子问为什么周二下午随机的天空是蓝色的。
Q:为什么我们需要使用聚类?
a:使我们的应用在受到相当大的压力(也将其视为比例)时更具性能。
要进一步推动重点回家,让我们快速看一下Node.js
中的简单服务器
const http = require('node:http');
const OPERATIONS_COUNT = 10;
const server = http.createServer((req, res) => {
if(req.url === '/') {
for (let i = 0; i < OPERATIONS_COUNT; i++) {}
res.end('What is clustering anyway :(');
} else {
res.end('clustering is the process of creating clusters')
}
});
server.listen(3000, () => console.log('Listening on port 3000'));
我们访问http://localhost:3000
,然后立即收到一条文字,说What is clustering anyway :(
,如果我们访问任何其他路线,我们会得到clustering is the process of creating clusters
-够简单。
现在让我们稍微增加齿轮,将OPERATIONS_COUNT
增加到10_000_000_000
,重新启动我们的服务器,然后再次击中/
端点。现在,我们看到为恢复响应所花费的时间的滞后滞后,但更重要的是让我们注意到,尽管/
仍在处理我们的初始请求,但也暂停了对服务器的任何后续请求。聚类有助于避免其中一些问题
Q:什么是聚类?
a:首先让我们看一下群集,根据牛津词典:
一组类似的事物或被定位或紧密合并在一起的人。
因此,聚类只是在应用程序中制作簇的过程。
Q:如何使用聚类
a:我很高兴您问,这是今天的重点。
在抽象级别的聚类是一个平行于实现共同目标的两个或多个节点/过程的组。这可以实现一个任务,这些任务否则可以在一个具有自己内存,线程池和引擎实例的克隆过程网络中分布一个过程,从而提高了应用程序的整体性能。
流程通常在封闭的网络中连接,使它们可以同步互动。然后,这些过程由负责委派任务的一个主过程(主要节点)组成,然后是处理这些分配任务的子过程(克隆节点)。
群集配置的类型
- 主动式配置
- 主动构型配置
就像负载平衡器一样,群集可以被配置为主动活动或主动 - 符合性。主动活动配置使所有子流程都在主过程并肩上积极处理任务,而主动 - 辅助配置将所有工作负载保持在总体过程中,并且只有委派任务,如果主过程失败/经验停机时间。
对于本文的范围,我将重点关注主动配置
设置流程
接下来,我们将设置流程以正确说明上面代码段中的滞后。
node.js有一个名为cluster
的内置库,该库可以在我们的应用程序中进行聚类。我们的代码最初是在一个核心(主节点)上运行的,然后我们将打电话给计算机中的额外核心作为工作节点。每个计算机的核心量都不同。要检查计算机的内核数量,可以将摘要复制到下面的
const os = require('os');
console.log(os.cpus());
/** You would get back an array that is structured similarly
* [
* {
* model: 'Intel(R) Core(TM) i5-9878U CPU @ 1.40GHz',
* speed: 1400,
* times: {
* user: 92892892,
* nice: 0,
* sys: 111111,
* idle: 10101010,
* irq: 0
* }
* },
* {
* ...
* }
* ]
*/
CPU对象数组具有这些值
- 模型:CPU模型
- 速度:MHz中的CPU速度
- 用户:CPU在用户模式上花费的毫秒数
- 不错的:CPU在不错的模式下花费的毫秒数
- sys :CPU在SYS模式上花费的毫秒数
- 空闲:CPU在闲置模式上花费的毫秒数
- irq :CPU在IRQ模式上花费的毫秒数
要从CPU中获取更多信息,您可以使用node-os-utils软件包。
到我们的摘要中,我们将添加一个群集和分拆,尽可能多地处理计算机处理
const cluster = require('node:cluster');
const http = require('node:http');
const os = require('node:os');
const cores = os.cpus().length;
const OPERATIONS_COUNT = 10_000_000_000;
const server = http.createServer((req, res) => {
if (req.url === '/') {
for (let i = 0; i < OPERATIONS_COUNT; i++) {}
res.end('What is clustering anyway :(');
} else {
res.end('clustering is the process of creating clusters');
}
});
if (cluster.isMaster) {
for (let i = 0; i < cores; i++) {
cluster.fork();
}
} else {
server.listen(3000, () => console.log('server listening on port 3000')); // only listen to port once all child nodes have been created
}
当我们这次访问/
时,然后随后访问/about
,我们可以看到/about
不会因/
的处理而持有。这说明了一个工作过程介入并处理了下一个请求。
要在我们的应用程序中部署子进程的性能增益进行数学,让我们想象一个节点可以每分钟处理1000 requests
,使用8 nodes
的群集,我们将该请求提高到8000 requests
又增加了8倍的输出!<<<<<<<<<<<<<<<<<<< /strong>不确定您对此的感觉,但对我来说,这让我震惊。
聚类经常用于软件开发中,甚至在某些技术中,例如Kubernetes和Redis。
。