gpt4 book ai didi

java - 应用实例之间不兼容 : prevent rabbitmq to consume messages with particular header

转载 作者:行者123 更新时间:2023-12-02 03:06:45 24 4
gpt4 key购买 nike

我有两个使用 spring 和rabbitmq 的同一个java 应用程序实例。实例向队列发送消息,但我无法预测哪个实例将使用它(如预期)。

我更新了 java 应用程序。由于某些原因,新旧版本之间不兼容:新版本无法消费旧版本的消息,反之亦然。

我们无法在部署新版本时提供服务中断,因此我们无法同时停止两个实例。我们必须停止实例 A,通过更新重新启动实例 A,然后停止 B 并通过更新重新启动它。

当我拥有 A 的新实例和 B 的旧实例时,如果消息是由 B 生成的,则 A 无法按预期使用消息。

为了解决这个问题,我们的想法是向rabbitmq消息添加一个 header 。我创建了一个自定义的rabbitmq模板:

@Override
protected Message convertMessageIfNecessary(final Object object) {
Message message = super.convertMessageIfNecessary(object);
MessageProperties messageProperties = new MessageProperties();
messageProperties.setHeader("version", version);
return new Message(message.getBody(), messageProperties);
}

这会添加一个包含应用程序版本的新 header 。然后我想在确认消息之前检查此 header 。

例如:

  • A 发送版本 4 的消息
  • B 收到消息 -> 不消费也不确认,因为 B 版本是 3。
  • A 收到消息 -> 消费,因为 A 版本是 4。

这样的配置可能吗?

我还查看了 @RabbitListener 组属性,但我不确定如何处理它。

感谢您的帮助

最佳答案

你可以这样做,但效率不会很高。当 B(3) 实例拒绝消息时,无法保证重新传递到 B(4) 实例;虽然这最终可能会发生,但根据具体情况,它可能会首先多次进入 B(3)。

简单地将新队列绑定(bind)到交换可能更容易/更好;让 A(4) 发布到新队列,B(4) 从中消费,而旧 B(3) 则从旧队列中消费。

当所有 A(3) 实例已取消部署,并且从旧队列中消耗了所有消息时,移除最后一个 B(3) 并删除队列。

关于java - 应用实例之间不兼容 : prevent rabbitmq to consume messages with particular header,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41612419/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com