0

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

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

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

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

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

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

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

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

4

1 回答 1

0

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

是否基于处理延迟、可扩展性等选择正确的策略?

是的

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

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

于 2016-12-08T22:32:05.993 回答