Websockets:同时收听多个连接?

时间:2018-05-23 09:14:58

标签: multithreading asynchronous websocket

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

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

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

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

1 个答案:

答案 0 :(得分:1)

  

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

错误。

使用事件编程设计时,您将使用IO“reactor”将IO相关事件添加到事件循环中。

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

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

应该避免阻止代码,并且应该将大/复杂的任务分割成许多“事件”。您的代码无法在IO readwrite上“阻止”(等待)。

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

  

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

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

这是一项便利功能,而非要求。

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

  

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

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

将TCP / IP连接附加到特定核心可以(有时)提高性能,但这是多对一关系。如果我们不得不为每个连接专用一个CPU核心,那么服务器的价格就会从屋顶射出。