保证通过websocket协议传递消息



我正在从交易所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端点以最大限度地减少过期数据。

最新更新