【发布时间】:2016-12-08 08:05:24
【问题描述】:
我今天被问到这个问题,答案似乎在我的团队中出现了分歧。
场景 您有多个发布者向 RabbitMQ(通过 EasyNetQ)发送有关某些主题的事件(消息)。他们说他们保证先进先出。他们想要构建一个系统来保证按顺序“处理”某个“主题”的消息。
我的解决方案 有一个缓存,每个主题都保存一个“版本号”,如果序列不匹配,则保存对消息的处理。您可以在第一个事件处理完成后重试处理消息(延时重试)并将缓存更新到新的目标版本。这意味着消费者基本上是在等待另一个消费者完成处理。这适用于需要毫秒而不是秒的事情,因为它是一种锁定。
另外,我说过我们可以为像这样http://blog.jonathanoliver.com/cqrs-out-of-sequence-messages-and-read-models/这样的乱序事件实现一个暂存表
提出问题的人说这两个答案都不正确。
他们说的解决方案是使用路由密钥和直接交换,并且让主题始终属于同一个消费者。一种粘性负载平衡系统。 我指出这限制了系统的按需可扩展性,因为交换/绑定需要根据任何时间点上的消费者数量进行更新。
我真的很想听听以前实施过这种模式的人的意见。这里有正确和错误的解决方案,还是基于处理延迟、可扩展性等选择正确策略的情况?
编辑:澄清。我期待找到每种方法的优缺点,以确定哪种解决方案更适合我的情况。有没有什么陷阱等?
【问题讨论】: