quickfixj - 修复协议并使用交错的实时消息重新发送?
问题描述
当我们收到与新/新消息交错的重发消息时,修复(即快速修复)客户端的正确行为是什么?
我有一种情况,我们在登录时检测到大量丢失的消息,msgseqnum 比预期的要高。
发起者发出重新发送(开放式)。
接收到新的/未经请求的消息并将其放入队列中。
有趣的部分在收到第一个错过的修复消息后开始,(第一个重发消息,34 = BeginSeqNo)
当这种情况发生时,我们的 quickfixn 发起方进入某种模式并考虑重新发送完成(或其他),当我们在许多重新发送的消息后不久收到一条新的/未经请求的消息,该消息与重新发送流交错时,我们的发起方将发送一个新的重发。
这个序列继续下去,我们最终会遇到大量的并发重新发送,并且每个重新发送的消息都充满了网络。
由接受者交错实时和重新发送提要是否正确?
在这种情况下,quickfixn 发起者是否应该再次发送重新发送?
(没有“重新发送完成”消息,所以我可以理解发送新重新发送的行为,但已经有重新发送正在进行中..)
接受者实际上应该进行并发和重叠重发吗?
编辑/添加问题,因为评论太长了。
我们的 qfn 配置了默认的 SendRedundantResendRequests (false),并且它对很多“不发送另一个”也有效。
参见例如日志:
20:53:35.087 : Received logon
20:53:35.087 : MsgSeqNum too high, expecting 2999869 but received 3002522
20:53:35.103 : Sent ResendRequest FROM: 2999869 TO: 0
20:53:35.103 : MsgSeqNum too high, expecting 2999869 but received 3002523
20:53:35.103 : Already sent ResendRequest FROM: 2999869 TO: 0. Not sending another.
[ very many 'already sent resendrequest' cut away ]
20:53:37.134 : Already sent ResendRequest FROM: 2999869 TO: 0. Not sending another.
20:53:37.134 : MsgSeqNum too high, expecting 2999869 but received 3004823
20:53:37.134 : Already sent ResendRequest FROM: 2999869 TO: 0. Not sending another.
20:53:37.134 : MsgSeqNum too high, expecting 2999869 but received 3004824
20:53:37.134 : Already sent ResendRequest FROM: 2999869 TO: 0. Not sending another.
20:53:37.134 : ResendRequest for messages FROM: 2999869 TO: 0 has been satisfied.
20:53:37.197 : MsgSeqNum too high, expecting 2999877 but received 3004825
20:53:37.197 : Sent ResendRequest FROM: 2999877 TO: 0
20:53:37.197 : ResendRequest for messages FROM: 2999877 TO: 0 has been satisfied.
20:53:37.197 : MsgSeqNum too high, expecting 2999893 but received 3004826
20:53:37.197 : Sent ResendRequest FROM: 2999893 TO: 0
20:53:37.212 : ResendRequest for messages FROM: 2999893 TO: 0 has been satisfied.
20:53:37.244 : Received SequenceReset FROM: 2999893 TO: 2999894
20:53:37.259 : MsgSeqNum too high, expecting 2999905 but received 3004827
20:53:37.259 : Sent ResendRequest FROM: 2999905 TO: 0
20:53:37.259 : ResendRequest for messages FROM: 2999905 TO: 0 has been satisfied.
20:53:37.275 : MsgSeqNum too high, expecting 2999919 but received 3004828
20:53:37.275 : Sent ResendRequest FROM: 2999919 TO: 0
20:53:37.275 : ResendRequest for messages FROM: 2999919 TO: 0 has been satisfied.
20:53:37.275 : MsgSeqNum too high, expecting 2999933 but received 3004829
20:53:37.275 : Sent ResendRequest FROM: 2999933 TO: 0
事件“从:2999869 到:0 已满足”使 qfn 认为正在进行的重新发送已完成,并且在下一个“MsgSeqNum 太高,预期为 2999877 但收到 3004825”时发出另一个重新发送,尽管已经有重新发送正在进行。
这继续下去,上面的例子给出了多个并发重新发送。
客户端是否应该在 3002521 之前发送另一个重发请求?
这里发生的情况是我们收到重新发送的消息 2999869 - 2999876 但随后我们收到 3004825(不正确?)触发新的重新发送。
解决方案
推荐阅读
- php - 让 Laravel 5.8 计算其他字段中的数据,而不仅仅是 unsignedInteger
- ios - SwiftUI:.transition 将 ZStack 中的对齐方式从中心更改为顶部?
- java - 在这个程序中,为什么 JOptionPane 条件满足时不显示?
- xcode - xcrun:错误:无法找到实用程序“simctl”,不是开发人员工具或 PATH
- javascript - 使用 axios 发布请求获取错误 400
- django - Django:存储用户在 Django 项目中共享的上传文件(pdf、文档)的最佳位置在哪里?
- apache-kafka - 当记录处理时间超过“max.poll.interval.ms”时,偏移提交会发生什么?
- docker - 端口绑定8080时Docker无法访问Host中的应用程序
- jquery - 带有悬停效果引导的图像滑块
- c - 如何在没有查找表的情况下将表示编码字符(例如 "0x79" 或 "\n" )的字符串转换为其表示的整数值