因此,我将尽我所能解释这一点:
我编写了一个 TCP 服务器,它接受来自可穿戴设备(gps 手环类型)的数据,使用net
in NodeJS
. TCP 服务器有connections = {}
属性,它包含所有的连接,像这样:
- 服务器接受连接
- 设备发送握手包,其中包含
device id
- 套接字存储如下:
connections[device_id] = socket
同样的 TCP 服务器也有express
服务器,它允许我使用 JSON post 将数据直接发送到设备:curl -XPOST https://localhost:8080/send/device_id -d '{"command": "test"}'
服务器解析 url 并写入套接字connections[params.device_id].write()
这一切都很好,当使用pm2 start server.js
. 我能够跟踪设备、接受和发送数据等。
问题是,当我pm2 start -i 5 server.js
在集群模式下启动服务器时,设备连接工作正常,但express
部分给我带来了问题。
例如:当我curl -XPOST https://localhost:8080/send/device_id -d '{"command": "test"}'
在 80% 的时间内使用时,这将转到错误的实例server.js
,因为有五个server.js
正在运行的副本,每个副本都有express
服务器,并且由于 PM2 管理所有内容,我的请求将到达给定的tcp
服务器device_id
5 次中有 1 次连接。按照我的理解,PM2 启动 5 个实例,server.js
并管理和平衡 和 的tcp
连接express
。
所以,我的问题是,我应该如何管理这个?有没有办法告诉 PM2 将端口转发8080
到集群中所有正在运行的实例?这样我可以向所有实例发送单个命令,并在实例中检查 device_id 是否已连接,并写入它的套接字。
这可能吗?如果可以,这是个好主意吗?如果不是,那么正确的方法是什么?
希望我设法解释
问候
* 编辑 *
从最初的问题可能不清楚,但有socket
问题是从net.createServer
函数传递的,比如
const net = require('net');
const PORT = 8181;
let connections = {}
const server = net.createServer((c) => {
//... device id parse
connections[device_id] = c;
});
server.listen(PORT, () => {
console.log('Server started on', PORT);
});