【问题标题】:FIFO queue to guarantee ordered "processing" of messages (multiple consumers)?FIFO队列保证消息的有序“处理”(多个消费者)?
【发布时间】:2016-12-08 08:05:24
【问题描述】:

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

场景 您有多个发布者向 RabbitMQ(通过 EasyNetQ)发送有关某些主题的事件(消息)。他们说他们保证先进先出。他们想要构建一个系统来保证按顺序“处理”某个“主题”的消息。

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

另外,我说过我们可以为像这样http://blog.jonathanoliver.com/cqrs-out-of-sequence-messages-and-read-models/这样的乱序事件实现一个暂存表

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

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

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

编辑:澄清。我期待找到每种方法的优缺点,以确定哪种解决方案更适合我的情况。有没有什么陷阱等?

【问题讨论】:

    标签: .net rabbitmq easynetq


    【解决方案1】:

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

    没有

    这是一个基于处理延迟、可扩展性等选择正确策略的案例吗?

    是的

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

    每次有人问,至少有 2 个不同的答案。它们都没有“正确”或“错误”之分,但都更适合某些情况,具体取决于上下文。

    【讨论】:

      猜你喜欢
      • 2013-06-09
      • 2019-10-16
      • 1970-01-01
      • 2018-07-13
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多