FIFO队列保证消息的有序“处理”(多个消费者)?

时间:2016-12-08 08:05:25

标签: .net rabbitmq easynetq

我今天被问到这个问题,答案似乎在我的团队中分歧。

方案 您有多个发布者向RabbitMQ(通过EasyNetQ)发送有关特定主题的事件(消息)。他们说他们保证FIFO。他们希望构建一个系统,以保证按顺序“处理”“主题”的消息。

我的解决方案 拥有一个缓存,其中包含每个主题的“版本号”,并在序列不匹配时保留对邮件的处理。您可以在第一个事件处理完成后重试处理消息(延迟重试),并将缓存更新为新的目标版本。这意味着消费者基本上在等待另一个消费者完成处理。这适用于需要几毫秒而不是秒的事情,因为它是一种锁定。

或者我说我们可以像这样http://blog.jonathanoliver.com/cqrs-out-of-sequence-messages-and-read-models/

实现无序事件的保留表

提出问题的人说这些答案都不正确。

他们说的解决方案是使用路由密钥和直接交换,并且主题始终是同一个消费者。一种粘性负载平衡系统。 我指出,这限制了系统的随需应变可扩展性,因为交换/绑定需要根据任何时间点的消费者数量进行更新。

我真的想得到以前实施过这种模式的人的意见。这里有正确和错误的解决方案,还是基于处理延迟,可扩展性等选择正确的策略?

编辑:澄清。我期望找到每种方法的优缺点,以确定哪种解决方案更适合我的上下文。有没有陷阱等?

1 个答案:

答案 0 :(得分:0)

  

这里有正确和错误的解决方案

没有

  

是基于处理延迟,可扩展性等选择正确策略的情况吗?

这是一个在stackoverflow上经常被问到的问题,并经常在网络上的博客文章中回答。

每当有人询问时,至少有2个不同的答案。没有一个是“正确的”或“错误的”,但根据情境,它们都更适合某些情况。