消息怎么会乱序



我已经使用QuickFix/.NET很长时间了,但在过去的两天里,引擎似乎两次发送了不按顺序的消息。

下面是一个例子,第三条消息不按顺序:

20171117-14:44:34.627 : 8=FIX.4.4 9=70 35=0 34=6057 49=TRD 52=20171117-14:44:34.622 56=SS 10=208
20171117-14:44:34.635 : 8=FIX.4.4 9=0070 35=0 34=6876 49=SS 56=TRD 52=20171117-14:44:34.634 10=060
20171117-14:45:04.668 : 8=FIX.4.4 9=224 35=D 34=6059 49=TRD 52=20171117-14:45:04.668 56=SS 11=AGG-171117T095204000182 38=100000 40=D 44=112.402 54=2 55=USD/XXX 59=3 60=20171117-09:45:04.647 278=2cK-3ovrjdrk00X1j8h03+ 10=007
20171117-14:45:04.668 : 8=FIX.4.4 9=70 35=0 34=6058 49=TRD 52=20171117-14:45:04.642 56=SS 10=209

我知道QuickFix记录器不在一个单独的线程中。

是什么原因导致了这种情况的发生?

消息编号是使用quickfix/n中的GetNextSenderMsgSeqNum方法生成的,该方法使用锁定。

public int GetNextSenderMsgSeqNum()
{
lock (sync_) { return this.MessageStore.GetNextSenderMsgSeqNum(); }
}

在我看来,消息是按顺序生成的,您的应用程序是按不同的顺序显示的。在某些情况下,发送方和接收方不同步,接收方期望不同的序列号,发起方向接收方发送消息,表示期望不同的顺序号。

在这种情况下,可以使用方法调用将的序列号更改为预期的序列号,以更新序列号或转到存储文件夹并打开扩展名为.seqnums的文件并更新序列号。我希望这会有所帮助。

由于两条消息的日期时间完全相同,这可能是排序问题。这在任何排序列表中都很常见,其中两个不同项目的索引相同。如果这是在你自己的代码中,我建议你在密钥中包含一个额外的元素,比如序列号

QuickFix发送的多条具有相同时间戳的消息可能会按顺序发送。

StackOverflow上之前的一个回答建议在接收端重新订购,但没有被接受:QuickFix-消息不按顺序

如果你决定将自己限制在每毫秒一条消息,比如在发送之间使用sleep()命令,一定要提高进程的调度优先级:https://msdn.microsoft.com/en-us/library/windows/desktop/ms685100(v=vs.85).aspx即使你只要求睡一毫秒,你通常也会睡很长时间,但我在ABOVE_NORMAL_PRIORITY_CLASS中睡了大约1-2毫秒。(Windows 10)

您可以尝试禁用Nagle的算法,该算法将多个TCP消息聚合在一起并同时发送。Nagle本身不会导致消息无序发送,但QuickFix可能会以某种奇怪的方式手动缓冲消息。尝试告诉QuickFix使用SocketNodelay立即发送它们:http://quickfixn.org/tutorial/configuration.html

最新更新