首页 > 解决方案 > Websockets:同时监听多个连接?

问题描述

我正在做一个项目,其目标是使用 websockets 从金融交易所接收和存储实时数据。我对这项技术有一些非常普遍的问题。

假设我打开了两个 websocket 连接,从两个不同的服务器接收实时数据。如何确保不错过任何消息?我学了一点异步编程(python asyncio),但似乎并没有解决问题:当我听一个连接时,我不能同时听另一个,对吧?

我可以想到两种解决方案:第一种要求服务器使用缓冲系统来发送数据,但我认为情况并非如此(Binance、Bitfinex ......)。我看到的第二个解决方案是使用不同的核心来监听每个 websocket。如果我的笔记本电脑有 8 个内核,我可以监听 8 个连接并确保不会错过任何消息。我想我可以通过使用云服务来扩大规模。

这是正确的还是我错过了什么?非常感谢。

标签: multithreadingasynchronouswebsocket

解决方案


当我听一个连接时,我不能同时听另一个连接,对吗?

错误的。

使用事件编程设计时,您将使用一个 IO“反应器”,它将 IO 相关事件添加到事件循环中。

这允许您的代码对来自多个连接的事件做出反应。

代码确实会按顺序对事件做出反应,但只要您的代码不“阻塞”,这些事件就可以快速有效地处理。

应该避免阻塞代码,大/复杂的任务应该被分割成许多“事件”。您的代码不应该在 IOreadwrite.

这将允许您的代码处理所有连接而不会出现明显延迟。

...第一个要求服务器使用缓冲系统来发送数据...

许多事件框架使用内部缓冲区,当引发“就绪”事件时,该缓冲区会流式传输到 IO。例如,drained在 node.js(或on_readyfacil.io)中查找事件。

这是一个方便的功能,而不是一个要求。

事件循环也可以添加一个“准备就绪”事件,并假设您的代码将在部分write调用返回EAGAIN/后处理缓冲EWOULDBLOCK

我看到的第二个解决方案是使用不同的核心来监听每个 websocket。

没必要。具有事件设计的单核上的单线程应该支持具有合理负载的数千(和数万)并发客户端(每个客户端的负载是一个重要的性能因素)。

将 TCP/IP 连接附加到特定核心可以(有时)提高性能,但这是多对一的关系。如果我们必须为每个连接分配一个 CPU 内核,那么服务器价格就会飙升。


推荐阅读