我在执行股票交易引擎。我通过UDP接收代码,每个udp多播数据包都有序列号。Exchange一个接一个地发送数据包,但由于UDP没有获得订单,它们可能(也将)以轻巧的“混合”顺序接收,举个例子:
1 2 3 5 4 6 7 10 9 8 11 12 13 14 15假设我按正确的顺序接收数据包,那么一切都会很容易--我可以使用Queue添加数据包并在以后对它们进行排线。但是由于数据包没有完全有序,我有几个问题:
1 2 3 5.5毫秒后..。4-好1 2 3 5.10毫秒后..。4-恢复1 2 3 5 6 7-恢复
发布于 2012-03-07 21:47:54
您可以使用priority queue来解决重新排序问题,序列号作为键(优先级)。最简单的优先级队列只是一个有序字典。恢复问题可以通过优先级队列和闹钟的组合来解决。
发布于 2012-03-07 21:48:55
这可能不是最有效的方法,但我过去使用过OrderedDictionary (尽管SortedDictionary可能更合适)来处理无序问题。使用序列号作为密钥,以数据包数据作为值。
不幸的是,我无法回答你的第二个问题(没有付出很大的努力)。我建议的唯一一件事是扩展您的协议,允许接收者发送一种可由接收方发送给发端者的回收信息,告诉他们重新发送数据包,因为原来的数据包被丢弃了。我有这样的逻辑(只是要复杂得多),虽然它是公司财产,所以我不能分享它。希望这能让你渡过难关。
发布于 2012-03-07 22:07:08
如果排序是关键的话,问题就会变得更复杂--例如,您可以使用优先级队列,但是您也不希望处理队列之外的任何东西,除非是序列中的下一个队列。因此,您可能希望实现一个优先级队列,该队列也基于序列阻塞。
在这种情况下,一旦找到丢失的数据包,您可能希望在一个单独的线程中启动恢复过程--没有必要等待--如果数据包到达,那么就可以忽略恢复结果。
这类似于音频流中的抖动缓冲以重新排序UDP数据包.http://en.wikipedia.org/wiki/Jitter#Jitter_buffers。
https://stackoverflow.com/questions/9609500
复制相似问题