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