2011-02-11 123 views
8

RabbitMQ为我正在计划的项目打勾,保存一个。我会让不同的工作人员在队列中进行监听,并且他们首先处理最新的消息(即最新的序列号)(LIFO)是很重要的。RabbitMQ重排消息

我的应用程序是这样的新消息几乎过时的旧信息。如果你有工作人员,你仍然可以处理旧信息,但重要的是先做好新信息。

拖网各种论坛和这样我只能看到一个解决方案,这是对客户端来处理消息时,它应该首先之后:

  • 消耗所有消息他们根据
  • 再定购序列号
  • 重新提交给队列
  • 消耗所述第一消息

丑陋和PROBL如果客户中途死亡,则为ematic。但是,这里的mabye有一个更好的解决方案。

我的研究是基于(部分):

注:消息的预期流量将大约在一些队列的1msg /小时和100 /分钟的范围其他人。所以没有什么恒星。

回答

3

由于没有回复我想我做功课相当好;)

不管怎么说,讨论与其他利益相关者就决定我可以删除LIFO要求对于现在的要求了。当涉及到它时,我们可以担心。

我们可能最终采用的解决方案是让工作人员打开第二个队列,让主人可以使用它让工作人员知道要忽略哪些工作+提供额外的控制/监视信息(看起来我们会无论如何需要)。

执行AMQP 1.0规范的RabbitMQ在这里也可能有所帮助。

所以我会将这个问题标记为现在的答案。其他人仍然可以自由添加或改进。

1

一种可能性是在一个循环中使用basic.get并等待响应basic-ok.message-count成为零(扔掉所有其他消息):

while (<get ok> = <call basic.get>) { 
    if (<get ok>.message-count == 0) { 
    // Now <get ok> is the most recent message on this queue 
    break; 
    } else if (<is get-empty>) { 
    // Someone else got it 
    } 
} 

当然,你必须设置消息在代理上路由模式,这样一个消费者扔掉消息不会混淆另一个消费者。尽量避免重新排列消息,因为它们将重新排列在堆栈顶部,使它们看起来像最近一样。

+0

感谢您的回复。但是,我不希望一个消费者挨饿其他人的工作。我宁愿让其他消费者使用稍微不太新的消息(它们仍然提供一些信息),而不是让消费者X空闲队列,而让它们闲置。虽然这也取决于我猜测的消息速率。 – dgorissen 2011-03-09 10:27:44