聚类:好部分
#javascript #node #systemdesign

上周,我深入实验了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:我很高兴您问,这是今天的重点。

在抽象级别的聚类是一个平行于实现共同目标的两个或多个节点/过程的组。这可以实现一个任务,这些任务否则可以在一个具有自己内存,线程池和引擎实例的克隆过程网络中分布一个过程,从而提高了应用程序的整体性能。

流程通常在封闭的网络中连接,使它们可以同步互动。然后,这些过程由负责委派任务的一个主过程(主要节点)组成,然后是处理这些分配任务的子过程(克隆节点)。

群集配置的类型

  1. 主动式配置
  2. 主动构型配置

就像负载平衡器一样,群集可以被配置为主动活动或主动 - 符合性。主动活动配置使所有子流程都在主过程并肩上积极处理任务,而主动 - 辅助配置将所有工作负载保持在总体过程中,并且只有委派任务,如果主过程失败/经验停机时间。

对于本文的范围,我将重点关注主动配置

设置流程

接下来,我们将设置流程以正确说明上面代码段中的滞后。
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。