因此,我将尽我所能尝试对此进行解释:
我编写了一个TCP服务器,该服务器使用net
中的NodeJS
从可穿戴设备(gps手镯类型)接收数据。 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
部分给了我麻烦。
例如:当我在80%的时间内使用curl -XPOST https://localhost:8080/send/device_id -d '{"command": "test"}'
时,它将转到错误的server.js
实例,因为有server.js
的五个副本在运行,并且每个副本都有express
服务器,并且由于PM2可以管理所有内容,因此我的请求将到达tcp
服务器,其中给定的device_id
在5次中有1次连接。以我的理解,PM2启动server.js
的5个实例,并管理和平衡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);
});