问题标签 [node-cluster]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - 节点集群没有将任务分派给另一个可用的工作人员
这是我关于 Stack-overflow 的第一个问题,所以请原谅我在这个问题中的任何错误或信息不足。
所以,我试图为我的服务器使用nodeJS的集群模块,并通过我的windows机器运行nodeJS。我知道nodeJS在windows中没有任何集群模块的调度策略,所以我已经明确地将scheduling_policy设置为rr,如nodeJS docs所述。但问题是当我试图通过将一名工人置于无限循环中来保持忙碌时;当我们尝试向服务器请求“/”资源时,服务器没有将请求分派给另一个可用且空闲的工作人员。
请帮助我为什么它没有将请求发送给其他工作人员。
node.js - 如何在nodejs中处理与集群的tcp连接
我正在尝试了解如何在 nodejs 中处理与集群的 tcp 连接。主节点如何知道应该将连接路由到哪个子节点。我们需要处理这种情况还是节点自己处理?
node.js - 如何使用 NodeJS 的集群模块在多核上正确运行 socketio 服务器?
Socket IO 服务器在 NodeJs 的单个实例上运行良好。但是,当我使用 NodeJS 的集群模块在多个内核上运行服务器时,我收到错误消息,“在收到握手响应之前连接已关闭”。我google了一下原因,发现
问题的本质是,当你在一个服务器上运行多个Node应用线程(worker),或者多个服务器时,socket.io客户端连接被集群以随机循环的方式路由,并且握手/授权的io客户端请求得到处理给他们没有握手/授权的工人,混乱开始的地方。 来源链接
我已经尝试了几件事来使它工作,但到目前为止还没有成功。这是代码
文件:./config/socketio
我还尝试按照文档中的建议使用适配器 for redis。
此设置有时有效,但并非总是有效。我无法弄清楚丢失的点。
javascript - Node.js 集群
我正在用 Node.js 编写一个提供动态网页的应用程序。我希望这个应用程序能够扩展到多个 CPU 核心,因此我决定使用集群为每个 CPU 核心创建一个工作器。
我还使用第 3 方 API,它需要经常轮询以检查更改,并且经常需要根据用户输入进行查询和缓存。由于此 API 有速率限制,我希望在所有工作人员之间有一个 API 实例和缓存。
在多个工作人员之间共享资源(缓存和第 3 方 API)并与之通信的最佳方式是什么?我应该为资源创建一个单独的工作人员,还是使用主工作人员?
javascript - Node.js集群中worker和master之间的回调
我有一个 Node 应用程序,其中有许多提供动态页面的工作人员。每个工作人员都需要访问一个中心对象,该对象包含从 3rd 方 API 查找和缓存信息的方法。该对象将位于主进程上,以便工作人员可以轻松地与之通信。
我希望能够轻松访问缓存和 API 方法,并在工作进程的回调中获取响应。例如:如果我想从 API 中获取用户(或缓存,如果缓存),我会调用类似getUser('userID', callback)
where 回调是一个函数,该函数将与用户详细信息一起调用,或者如果发生错误则返回错误。
有什么简单的方法可以做到这一点吗?还是我设计得不好?有没有更好的方法在多个工作人员之间共享某个事物的单个实例?
node.js - 使用 websocket 进行节点集群
我有一个节点集群,主节点响应 http 请求。服务器还监听 websocket 连接(通过socket.io)。客户端通过所述 websocket 连接到服务器。现在客户端在各种游戏之间进行选择(每个节点进程处理一个游戏)。
我的问题如下:
- 我应该为每个节点进程打开一个新连接吗?如何告诉客户端他应该连接到确切的节点进程 X?(因为服务器可能会在其开启时处理传入的连接请求)
- 是否可以将套接字传递给节点进程,从而无需打开新连接?
- 如果我只使用一个连接(在主进程中)并将用户消息传递给相应的节点进程并将进程消息返回给用户,会有什么缺点?(我觉得在进程之间发送消息时复制相当大的对象会花费很多CPU)
node.js - 使用intellij远程调试节点js服务器
看到很多关于远程 Node js 服务器调试的帖子,并尝试了很多他们的解决方案,但没有设法让我的配置正常工作
我在具有以下“Node.js 远程调试”配置的 Windows PC 上安装了 Intellij:主机:my-server.dev.com 端口:5858
节点服务器本身安装在 UBUNTU 上,并在其上定义了以下端口转发规则:socat TCP-LISTEN:5858,fork TCP:localhost:6000
并且服务器使用以下命令运行(集群:/usr/local/n/versions/node/0.10.44/bin/node --debug=6000 /opt/play/play-server/main.js)
Intellij 将会话显示为已连接但无法在断点处中断
node.js - 如何在 NodeJS 中结束 master 的所有工作人员?
如果我的数据库无法连接,我需要终止所有工作人员......
javascript - Node.js v6.0.0 上 Visual Studio 代码 (F5) 上的集群问题
我对使用Cluster的Visual Studio 代码有一些问题
编辑
如果我按 Ctrl + F5它可以正常工作,除了F5之外它还在做什么,我是否需要始终使用 Ctrl 启动命令?
---
当使用 VS Code Launch 命令(F5)启动时,似乎工作人员永远不会启动。我是否需要对 .vscode/launch.json 文件进行一些更改以使集群正常工作。
实际代码复制自 Node.js 6 api https://nodejs.org/api/cluster.html#cluster_cluster
npm test Windows 命令提示符显示:
VS Code (F5)调试控制台显示:
VS 代码启动.json
index.js
node.js - 当集群退出并重新启动时,使用集群和 mariaSQL 100% 的 CPU 使用率
在我的 Node.JS 应用程序中,我使用集群来利用我的多核 CPU。我正在使用节点的 mariasql 库与我的数据库进行通信。由于该node-mariasql
库不支持池化,因此我使用第三方 - generic-pool来维护连接池。
我注意到,每当主线程中的连接在未捕获的异常导致其中一个子集群重新启动后关闭时,我们的 CPU 使用率就会上升到 100%。
每当子集群重新启动时,我都会破坏所有 MySQL 连接。
节点版本 - v4.2.2
MariaDB 版本 - v10.0.15
节点-mariasql 版本 - v0.2.5
可重现的代码 - https://github.com/bsurendrakumar/node-simplex/
代码片段
创建连接池...
在主线程...
一旦发生未捕获的异常...
清理功能...
池中的最小连接数设置为 5。它的所有配置都可以在这里找到。因此,当服务器启动时,通用池将启动 5 个与 MySQL 的连接并将它们保留在其池中。
池中的idleTimeout
对象的时间已设置为 120 秒。这意味着如果池中的对象超过 5 个(因为最少 5 个),并且其中一个在过去 120 秒内未使用,它将被销毁。
在服务器启动时,我正在对我们的国家模型进行简单调用以获取国家列表。这段代码在这里。这将建立与数据库的新连接,因此现在池中将有 6 个 SQL 连接,其中一个将在 120 秒后被清除。
以下是我认为问题在于我们使用mariasql库的分步过程 -
- 当服务器启动时,我将进程 ID 记录到控制台。获取主进程 ID,例如 - 20584。
使用 - 查看进程正在使用的文件描述符
ls -l /proc/20584/fd
。记下套接字连接。这个的输出看起来像这样 -lrwx------ 1 abijeet abijeet 64 Jun 9 19:24 12 -> socket:[2469914] lrwx------ 1 abijeet abijeet 64 Jun 9 19:24 13 -> socket:[2469917] lrwx------ 1 abijeet abijeet 64 Jun 9 19:24 14 -> socket:[2468106] lrwx------ 1 abijeet abijeet 64 Jun 9 19:24 15 -> socket:[2468109] lrwx------ 1 abijeet abijeet 64 Jun 9 19:24 17 -> socket:[2467206] lrwx------ 1 abijeet abijeet 64 Jun 9 19:24 18 -> socket:[2467208] lrwx------ 1 abijeet abijeet 64 Jun 9 19:24 19 -> socket:[2467210] lrwx------ 1 abijeet abijeet 64 Jun 9 19:24 2 -> /dev/tty lrwx------ 1 abijeet abijeet 64 Jun 9 19:24 20 -> socket:[2467212] lrwx------ 1 abijeet abijeet 64 Jun 9 19:24 21 -> socket:[2467214] lrwx------ 1 abijeet abijeet 64 Jun 9 19:24 22 -> socket:[2467306]
复制一些套接字编号,例如2467212,然后运行
lsof | grep 2467212
。您会注意到这些是与 MySQL 服务器的连接。的输出应该是这样的 -node 20584 abijeet 20u IPv4 2467212 0t0 TCP localhost:57092->localhost:mysql (ESTABLISHED) V8 20584 20585 abijeet 20u IPv4 2467212 0t0 TCP localhost:57092->localhost:mysql (ESTABLISHED) V8 20584 20586 abijeet 20u IPv4 2467212 0t0 TCP localhost:57092->localhost:mysql (ESTABLISHED) V8 20584 20587 abijeet 20u IPv4 2467212 0t0 TCP localhost:57092->localhost:mysql (ESTABLISHED) V8 20584 20588 abijeet 20u IPv4 2467212 0t0 TCP localhost:57092->localhost:mysql (ESTABLISHED)
通过访问http://127.0.0.1:3000/api/v1/country/list使服务器崩溃。这将使其中一个子进程崩溃。每当发生未捕获的异常时,我都会进行一些清理并退出。然后我分叉另一个进程来代替刚刚被杀死的进程。清理包括 -
- 关闭http服务器
- 关闭通用池中的 MySQL 连接
- 关闭 winston 记录器流。
- 等待主线程中的 MySQL 连接关闭。发生这种情况时,我正在向控制台写入日志 -
Destroying / ending master thread ID - 4984
- 检查您的 CPU 使用率,您会注意到其中一个 CPU 已达到 100%。
- 下一次运行,
strace -o log.txt -eepoll_ctl,epoll_wait -p 20584
. 请注意,您可能需要安装strace。此命令记录epoll_ctl, epoll_wait
Node.JS 进程进行的所有系统调用,并将其放入当前工作目录名为log.txt的文件中。 打开log.txt文件,您会注意到与这些类似的日志 -
epoll_wait(5, {{EPOLLIN|EPOLLHUP, {u32=16, u64=16}}}, 1024, 847) = 1 epoll_ctl(5, EPOLL_CTL_DEL, 16, 7ffe441aa850) = -1 EBADF (Bad file descriptor) epoll_wait(5, {{EPOLLIN|EPOLLHUP, {u32=16, u64=16}}}, 1024, 845) = 1 epoll_ctl(5, EPOLL_CTL_DEL, 16, 7ffe441aa850) = -1 EBADF (Bad file descriptor) epoll_wait(5, {{EPOLLIN|EPOLLHUP, {u32=16, u64=16}}}, 1024, 843) = 1 epoll_ctl(5, EPOLL_CTL_DEL, 16, 7ffe441aa850) = -1 EBADF (Bad file descriptor)
这里的文件描述符是16,如果你把它和你之前的
ls -l /proc/20584/fd
and关联起来lsof | grep 2467212
,你会发现这属于刚刚关闭的 MySQL 连接。
这让我相信在某个地方,即使与 MySQL 的连接被释放,也有一个文件描述符挂在那里,它仍在使用中。我在论坛上发现了各种类似问题的主题 -