我正在开发一个项目,其目标是使用websockets接收和存储来自金融交易所的实时数据。我对这项技术有一些非常普遍的问题。
假设我打开了两个websocket连接,从两个不同的服务器接收实时数据。如何确保不丢失任何消息?我已经学会了一些异步编程(python asyncio),但它似乎没有解决问题:当我听一个连接时,我不能同时听另一个,对吧?
我可以想到两个解决方案:第一个解决方案需要服务器使用缓冲系统来发送数据,但我不认为是这种情况(Binance,Bitfinex ......)。我看到的第二个解决方案是使用不同的核心来监听每个websocket。如果我的笔记本电脑有8个核心,我可以听8个连接,一定不要错过任何消息。我想我可以通过使用云服务来扩展。
这是正确的还是我错过了什么?非常感谢。
答案 0 :(得分:1)
当我听一个连接时,我不能同时听另一个连接,对吧?
错误。
使用事件编程设计时,您将使用IO“reactor”将IO相关事件添加到事件循环中。
这允许您的代码对来自多个连接的事件做出反应。
代码确实按顺序对事件做出反应,但只要您的代码没有“阻止”,就可以迅速有效地处理这些事件。
应该避免阻止代码,并且应该将大/复杂的任务分割成许多“事件”。您的代码无法在IO read
或write
上“阻止”(等待)。
这将允许您的代码处理所有连接而不会有明显的延迟。
......第一个要求服务器使用缓冲系统发送数据......
许多事件框架使用内部缓冲区,当引发“就绪”事件时,该内部缓冲区将流式传输到IO。例如,在node.js(或facil.io中的drained
)中查找on_ready
事件。
这是一项便利功能,而非要求。
事件循环也可以添加“准备就绪”事件,并假设您的代码将在部分write
调用返回EAGAIN
/ EWOULDBLOCK
后处理缓冲。
我看到的第二个解决方案是使用不同的核心来监听每个websocket。
没有必要。具有公平设计的单个核心上的单个线程应该支持数千(和数万)具有合理负载的并发客户端(每个客户端负载是一个重要的性能因素)。
将TCP / IP连接附加到特定核心可以(有时)提高性能,但这是多对一关系。如果我们不得不为每个连接专用一个CPU核心,那么服务器的价格就会从屋顶射出。