1

我需要为FAST协议实施提要仲裁。问题很常见,甚至有硬件解决方案由于问题广为人知,我确实认为至少应该有关于如何实现该问题的一般建议(我应该使用多少查询,多少环形缓冲区,多少读者,何时丢弃数据包等),可能有人可以指出我的一些实现。对于那些不熟悉 FAST 的人,我添加一些描述:


所有 UDP 源中的数据都在两个不同的多播 IP 上的两个相同的源(A 和 B)中传播。强烈建议客户端接收并处理这两个提要,因为可能会丢失 UDP 数据包。处理两个相同的提要允许一个在统计上降低丢包的概率。未指定消息首次出现在哪个特定提要(A 或 B)中。要仲裁这些提要,应该使用在 Preamble 或标签 34-MsgSeqNum 中找到的消息序列号。Preamble 的使用允许在不解码 FAST 消息的情况下确定消息序列号。应使用以下算法处理来自提要 A 和 B 的消息:

  1. 收听提要 A 和 B
  2. 根据消息的序号处理消息。
  3. 如果之前已经处理过具有相同序列号的消息,则忽略该消息。

    // tcp 恢复算法进一步


所以我认为解决方案应该是这样的:

  1. 为两个提要中的每一个创建专用线程和专用缓冲区。数据到达时将数据添加到缓冲区。(应该是环形缓冲区还是队列还是什么?)

  2. 创建“旋转”的“阅读器”并检查两个线程是否有最后一个可用的“序列号”。一旦“序列号”可用,就需要处理下一个数据包,并且两个线程都应该在此之后丢弃它。

欢迎任何关于如何实现算法本身的建议以及可能使用哪些结构的建议。特别是可能有人可以建议无锁队列/环形缓冲区实现。

4

1 回答 1

0

FAST 协议通常用于市场数据流,因此数据以 UDP 数据包的形式到达,通常是多播。这些数据包是按顺序排列的,因此如果您需要在两个冗余馈送之间进行仲裁,您所要做的就是处理您首先收到的来自哪个通道的下一个预期数据包。迟到的欺骗数据包您只需丢弃。仲裁不仅减少了丢失数据包的机会(您必须在两个通道中都丢失它),而且减少了延迟,因为您总是有第二种选择,以防其中一个提要变慢。

您应该更关心解码 FAST 位。这可能很耗时。查看CoralFIX以获取有关如何从交换 XML 模板生成 FAST 解码源代码的示例。

免责声明:我是 CoralFIX 的开发者之一。

于 2014-10-21T20:53:20.457 回答