高性能非阻塞有序消息处理程序

时间:2012-03-29 19:16:41

标签: java concurrency messaging nonblocking

我有一些高并发消息处理程序接收有序消息,现在需要处理错误的有序消息:如果转发消息到达它应该通知,如果过期消息到达 - 它应该忽略它。

示例:如果1,2,3,5消息到达 - 它必须在5日通知有关错过的消息, 如果是1,2,3,4,2,5 - 它必须在4之后收到2时才通知陈旧消息。

因为它的吞吐量很高,所以不能使用锁。

以下是我目前的实施 - https://codereview.stackexchange.com/q/10329/5334

- 我已经解决了ABA问题,但在忽略陈旧的消息后无法解决问题1可能的错误警告:在1,2,3,4,2,5上 - 它会通知陈旧2(4之后)但是也可以在5日错误地通知有关错过的消息。

有没有办法为此任务修复它或其他非阻塞算法?

2 个答案:

答案 0 :(得分:1)

为什么不记住AtomicLong / AtomicInt中已经处理过的最高ID,然后如果下一条消息的id低,那么它就是'陈旧'而你只是把它扔掉,如果下一条消息id与上次记忆的不同,则大于1你警告说要失踪。

这应该回答你的特定问题,但我想知道你会在真正的“高并发”环境中得到多少这样的警告 - 可能很多。集成解决方案,例如Apache Camel,通常已经构建了它mechanisms来处理和检测乱序消息,这些消息非常精细,有队列等等。你可能想要使用一个,如果它们或者至少探索它是如何构建的更多的想法。

答案 1 :(得分:0)

由于两种状态均无效,因此您可能会两次报告​​该消息。

如果你得到1,2,3,5,4,那么你将报告“未收到消息4”消息,并且“消息4收到乱序”消息。

你几乎必须接受这个细节,除非你希望对“遗漏”的消息加上某种超时,如果他们没有在某个窗口中显示为乱序消息,则只报告错过。< / p>

也就是说,当您遇到它时,您会立即收到“收到的消息4”,但是您可能不会提交“消息4未收到”消息,可能要晚得多(N秒后,X消息稍后) ,无论什么是合适的。)

所以你只需要调和这两种情况以及你想如何处理它们。