我有一种情况,我正在处理与特定来源相关的事件。每个源都有一个键或 ID,我可以将其用作散列。来自每个源的事件必须按顺序处理,但来自不同源的事件可以并行化,以实现水平可伸缩性。将有数百个源密钥。
我计划在向 RabbitMQ 提交消息时将密钥设置为路由密钥的一部分,然后使用consistent-hash-exchange
以便将来自同一源的事件路由到同一队列。然后我正在考虑使用 TTL 动态绑定来自消费者的私有队列(以便在消费者关闭时优雅地删除它们)。一开始我只会有 2 或 3 个消费者来实现冗余,但如果我想因消息数量增加而扩大规模,我可以启动另一个消费者。
我的问题是如果消费者宕机并且队列中有消息会发生什么?理想情况下,我希望将队列中的消息重新路由回交换器,并将consistent-hash-exchange
它们路由到不同的队列(因为原始队列将不再存在)。
RabbitMQ 关于死信的文档没有明确提到消费者队列上的 TTL 场景,或者当队列被删除时会发生什么。
我的方法有意义吗?如何在通过特定路由键保留排序的同时实现我正在寻找的消费者容错?
注意:我知道如果在将死信消息路由到交换器的过程中,会出现更微妙的竞争条件,新消息最初路由到过期队列,现在将路由到不同的消费者,因此排序将是在那个特定的情况下被打破。