C# 消息怎么会乱序呢?

C# 消息怎么会乱序呢?,c#,quickfixn,C#,Quickfixn,我已经使用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

我已经使用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发送的具有相同时间戳的多条消息可能会无序发送

先前关于StackOverflow的回答建议在接收端重新订购,但未被接受:

如果您决定将自己限制为每毫秒一条消息,比如在发送之间使用sleep()命令,请确保增加进程的调度优先级: 你通常会睡很长时间,即使你只要求一毫秒,但我的睡眠时间大约为1-2毫秒,高于正常优先级。(视窗10)


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

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

public int GetNextSenderMsgSeqNum()
        {
            lock (sync_) { return this.MessageStore.GetNextSenderMsgSeqNum(); }
        }
在我看来,消息是按顺序生成的,应用程序的显示顺序不同。 在某些情况下,发送方和接收方不同步,接收方需要不同的序列号,发起方将消息发送给接收方,告知接收方需要不同的序列号

在这种情况下,可以使用方法调用update sequence或goto store folder将序列号更改为预期的序列号,然后打开扩展名为.seqnums的文件并更新序列号。
我希望这会有所帮助。

将SocketNodeDelay设置为true有什么缺点吗?@manimon SocketNodeDelay的缺点是带宽增加。每个TCP数据包的开销为40字节或更多。启用套接字延迟后,您可以将多条消息捆绑到一个数据包中,并且只需支付一次开销。