这似乎是一个非常普遍的问题,但我还无法找到答案。假设我有一个发布/订阅基础设施,并且解决方案的一个组件必须在接收到有关该主题的消息时采取行动(每条消息只应采取一次行动)。同样重要的是该组件具有高可用性并具有用于负载平衡的主动-主动语义。
使用 P2P 消息传递模式很容易通过运行多个消费者实例来侦听同一队列来实现这一点。但是,使用 pub/sub 时,消费者的每个实例都将收到自己的消息副本,因此可能会多次执行相同的操作。
我正在考虑的方法是拥有一个单独的组件,该组件将以主动-被动模式运行,并通过将消息转发到队列(它可以是另一个代理,甚至是 Redis 之类的东西)将 pub/sub 转换为 P2P。在翻译器的两个实例之间将有一个心跳消息,该消息将允许被动实例在活动实例因任何原因断开连接时立即订阅主题。
另一种选择是在所有活动实例之间共享存储,并且一旦一个实例开始处理消息,它将在存储中指示这一点,因此其他实例将直接从处理中删除消息。恐怕这会导致很多争用问题,从而使主动-主动配置的好处一无所获。
我正在寻找有关其他方法的建议,或者对我列出的方法进行改进。