【发布时间】:2021-07-21 21:25:31
【问题描述】:
我有一个数据提供者,它通过 TCP 连接为我提供股票价格。数据提供者只允许静态 IP 连接到他们的服务。
但由于我需要在将数据发送到前端之前对其进行格式化,因此我想使用我的 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 分析我的代码,但找不到明显的问题。
EDIT2:更具体地说:我的数据提供商为我提供股票报价。所以每次报价发生变化时,我都会得到新的数据。然后我解析这些数据并通过io.emit 发出它。这会是某种瓶颈吗?
这是我运行clinicjs后得到的配置文件:
【问题讨论】:
-
当然。您可以使用
io.emit()向 Socket.io 中所有连接的客户端广播消息(其中io是initialized Socket.io server instance)。 Socket.io服务器启动后连接数据提供者即可。 -
您确定要与数据提供者建立(低级)套接字连接,而不是 socket.io 套接字、
ws套接字或 http 连接吗? -
注意:socket.io 不是普通的 websocket 客户端/服务器。
-
afaik 我的数据提供者只允许 TCP 连接。我用新信息再次更新了我的问题
-
@Ic3m4n,您运行 Clinicjs 时的客户端(前端客户端)连接数是多少?
标签: javascript node.js express websocket