1

在我们的云环境中,当部署新实例时,我们会运行集成测试。但是,它变得棘手,因为新代码正在为正在部署的服务在队列中注入消息,而现有实例(以前的版本)仍在运行。我们有一个蓝/绿部署。

RabbitMQ 是否有可能让许多侦听器在队列上侦听但仅针对特定版本?

例如,所有正在运行的服务器都会读取版本 2017.10.20(以前的版本)或更早版本的消息,但它们不会读取新版本的消息。

这样我就可以部署一个新的服务,而其他的 Droplet 都不会读取它的测试消息。

正在部署的新服务具有与现有服务相同的功能。它产生和使用与当前运行的服务相同的消息类型。

4

1 回答 1

1

看起来您在同一个队列中混合了测试和生产消息。如果那是正确的,我认为您应该将它们分开。解决方案可能是 - 您部署发布/订阅integration test与生产队列不同的队列集的新服务。当您对集成测试感到满意时,您可以将实例切换到发布/订阅到生产队列中(例如,通过向它们发送带有新路由/队列名称的命令消息)或者只是使这些测试队列成为新的生产队列,然后淘汰旧集服务以及他们的队列。

例如:您当前的版本为 3.1,它在队列/路由上发布/订阅my_command_a_3.1my_command_b_3.1等等。然后您部署新的 3.2 版本的环境以与 3.1 版本并行运行。所有服务都在队列/路线my_command_a_3.2my_command_b_3.2. 然后,当您对 3.2 版本感到满意时,您将退出 3.1 版本及其队列。您需要先排空这些队列(首先关闭生产者,等待队列排空,然后关闭消费者)

我能想到的最接近您的问题的直接答案:如果消费者不支持消息的版本(您需要将版本放在消息本身上),您可以让您的消费者nack消息,要求代理重新排队。然后在某个时候它将由新版本的消费者处理(在某个时候循环算法将把新消息传递给新的消费者)。我认为这很肮脏,因为它在代理端产生了额外的无用工作,对于任何消息,您都不知道它什么时候实际被处理以及它会被重新排队多少次。

于 2017-12-19T20:03:35.757 回答