我正在从交易所API中提取未平仓合约数据。他们的websocket服务器非常不稳定,我们经常错过websocket更新。不要错过任何东西,这对我来说非常重要。问题是我不能保证;至少一次";在我的服务器和他们的服务器之间没有某种ACK-NACK方案的情况下交付,这是不可能的。
我想到了以下声明:
如果我们错过了任何websocket更新,我们可能会在某个时候回到HTTP。
对其REST的单个请求返回所有未平仓合约的状态,这是可靠的。也许websocket和REST应该以某种方式协同工作以实现这一点。
背压是第二个问题,Akka.NET很容易解决,但如果你提出不同的解决方案,我想知道如何解决。
在这种情况下你们打算用什么?
websocket服务器的非常不稳定
第三方系统似乎是罪魁祸首。如果他们不发信息,你就无能为力。但是,让我们假设他们发送了所有他们应该。。。
根据您所说的,WebSocket保持活动状态,并且您可以在错过消息后接收消息。由于WebSockets是通过TCP/IP操作的,任何没有从接收端接收到ACK的消息都会导致连接在后续消息到达之前失败。在C#/.Net中,这最终会表现为连接异常(超时、连接关闭等(。这似乎排除了网络传输问题。
在接收端,有几个库可能用于处理websocket。没有看到";消息接收";代码(甚至知道使用了哪个库(很难知道消息是否被正确处理。该代码尤其值得对线程问题进行仔细分析。
然而,最可能的问题是第三方系统正在发送一批数据,而不是一次只发送一条消息。表面上看,可能只发送一个值("位置"(,但可能同时发送多个更新。使用Fiddler(或通过记录接收到的整个原始有效载荷(可能有助于确定情况是否如此。
在这种情况下你们打算用什么?
如果第三方系统被证明是问题所在,除了websocket之外,似乎没有其他选择,只能尽可能频繁地使用REST端点轮询他们的系统(如果没有说明,你可能需要联系他们的工程团队,以确保你不会导致友好的DOS攻击(。
如果他们的系统正确地发送了所有更新,您可能需要缩短超时时间,更快地关闭/重新打开websocket连接,然后点击REST端点以最大限度地减少过期数据。