我需要为FAST协议实施提要仲裁。问题很常见,甚至有硬件解决方案由于问题广为人知,我确实认为至少应该有关于如何实现该问题的一般建议(我应该使用多少查询,多少环形缓冲区,多少读者,何时丢弃数据包等),可能有人可以指出我的一些实现。对于那些不熟悉 FAST 的人,我添加一些描述:
所有 UDP 源中的数据都在两个不同的多播 IP 上的两个相同的源(A 和 B)中传播。强烈建议客户端接收并处理这两个提要,因为可能会丢失 UDP 数据包。处理两个相同的提要允许一个在统计上降低丢包的概率。未指定消息首次出现在哪个特定提要(A 或 B)中。要仲裁这些提要,应该使用在 Preamble 或标签 34-MsgSeqNum 中找到的消息序列号。Preamble 的使用允许在不解码 FAST 消息的情况下确定消息序列号。应使用以下算法处理来自提要 A 和 B 的消息:
- 收听提要 A 和 B
- 根据消息的序号处理消息。
如果之前已经处理过具有相同序列号的消息,则忽略该消息。
// tcp 恢复算法进一步
所以我认为解决方案应该是这样的:
为两个提要中的每一个创建专用线程和专用缓冲区。数据到达时将数据添加到缓冲区。(应该是环形缓冲区还是队列还是什么?)
创建“旋转”的“阅读器”并检查两个线程是否有最后一个可用的“序列号”。一旦“序列号”可用,就需要处理下一个数据包,并且两个线程都应该在此之后丢弃它。
欢迎任何关于如何实现算法本身的建议以及可能使用哪些结构的建议。特别是可能有人可以建议无锁队列/环形缓冲区实现。