消息如何不按顺序排列?

时间:2017-11-17 16:10:07

标签: c# quickfixn

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

以下是一个示例,第3条消息不按顺序排列:

io.reactivex.observables

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

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

3 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

StackOverflow的上一个答案建议在接收方重新排序,但未被接受: QuickFix - messages out of sequence

如果您决定将自己限制为每毫秒一条消息,比如在发送之间使用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