我有一个通过 TCP 连接提供股票价格的数据提供商。该数据提供商仅允许静态 IP 连接其服务。
但是,由于我需要在将数据发送到前端之前对其进行格式化,因此我想使用我的 Express 后端作为代理。
这意味着:
- 我需要通过 WebSocket (socket.io) 将后端连接到我的数据提供商以获取数据(后端作为客户端)。 - 我需要使我的后端广播接收到的数据给前端(后端作为服务器)。
我的问题是:这是否可能?是否有更简单的方法来实现这一点?是否有文档说明如何同时将 express 应用程序用作 WebSocket 服务器和客户端?
编辑:
我现在已经解决了这个问题。但是,我的当前解决方案会因为巨大的 CPU 使用率而使我的 AWS EC2 实例死亡。这是我实现它的方式:
但是,由于我需要在将数据发送到前端之前对其进行格式化,因此我想使用我的 Express 后端作为代理。
这意味着:
- 我需要通过 WebSocket (socket.io) 将后端连接到我的数据提供商以获取数据(后端作为客户端)。 - 我需要使我的后端广播接收到的数据给前端(后端作为服务器)。
我的问题是:这是否可能?是否有更简单的方法来实现这一点?是否有文档说明如何同时将 express 应用程序用作 WebSocket 服务器和客户端?
编辑:
我现在已经解决了这个问题。但是,我的当前解决方案会因为巨大的 CPU 使用率而使我的 AWS EC2 实例死亡。这是我实现它的方式:
const net = require('net');
const app = require('express')();
const httpServer = require('http').createServer(app);
const client = new net.Socket();
const options = {
cors: {
origin: 'http://someorigin.org',
},
};
const io = require('socket.io')(httpServer, options);
client.connect(1337, 'some.ip', () => {
console.info('Connected to some.ip');
});
client.on('data', async (data) => {
// parse data
const parsedData = {
identifier: data.identifier,
someData: data.someData,
};
// broadcast data
io.emit('randomEmitString', parsedData);
});
client.on('close', () => {
console.info('Connection closed');
});
httpServer.listen(8081);
有没有人知道为什么这会导致巨大的CPU负载?我尝试使用clinicjs
分析我的代码,但我找不到明显的问题。
编辑2:更具体地说:我的数据提供程序提供股票报价。因此,每当报价变化时,我都会获得新数据。然后,我解析这些数据并通过io.emit
发出它。这可能会导致某种瓶颈吗?
这是我运行clinicjs
后得到的剖面:
io.emit()
在 Socket.io 中向所有连接的客户端广播消息(其中io
是已初始化的 Socket.io 服务器实例)。只需在 Socket.io 服务器启动后连接到数据提供程序即可。 - cbrws
socket或者一个http连接吗? - Christian Fritzsome.ip
发送的数据频率是多少?如果您也告诉我们接收到的数据大小,那就更好了。 - Saurav Kumar