如何使用 RabbitMQ 处理 blue/green 部署?
How to handle blue/green deployment with RabbitMQ?
在我们的云环境中,当部署新实例时,我们运行 集成测试。但是,它变得棘手,因为新代码正在为正在部署的服务在队列中注入消息,而现有实例(以前的版本)仍在 运行ning。我们有一个 blue/green 部署。
RabbitMQ 是否有可能让许多侦听器在队列上侦听但仅针对特定版本?
例如,所有 运行ning 服务器都会读取 2017.10.20(以前的版本)或更旧版本的消息,但不会读取较新版本的消息。
这样我就可以部署一个新服务,none 个其他 droplet 会读取它的测试消息。
正在部署的新服务与现有服务具有相同的功能。它生成和使用与当前 运行ning 服务相同的消息类型。
看起来您在同一个队列中混合了测试消息和生产消息。如果那是对的,我认为你应该把它们分开。
解决方案可能是 - 您将 publish/subscribe 的新服务部署到 integration test
不同于生产队列的队列集。当您对集成测试感到满意时,您可以将实例切换到 pub/sub 并进入生产队列(例如,通过向它们发送带有新 route/queue 名称的命令消息)或者只是使这些测试队列成为新的生产队列,并且淘汰旧的服务集及其队列。
例如:您的当前版本是 3.1,它 pubs/subs 在 queues/routes 上,如 my_command_a_3.1
、my_command_b_3.1
等。然后您部署一个新的 3.2 版本环境到 运行 与 3.1 版本并行。所有服务都在队列/路线 my_command_a_3.2
和 my_command_b_3.2
上运行。然后,当您对 3.2 版本感到满意时,您将淘汰 3.1 版本及其队列。您需要先清空这些队列(先关闭生产者,等待队列清空,然后关闭消费者)
我能想到的最接近你问题的直接答案:如果消费者不支持消息的版本,你可以让你的消费者 nack 一条消息(你需要将版本放在消息本身上),要求经纪人重新排队。然后在某个时候它将由新版本的消费者处理(在某个时候循环算法会将新消息传递给新消费者)。在我看来,这很脏,因为它会在代理端创建额外的无用工作,对于任何消息,您不知道它何时会被实际处理以及它会被重新排队多少次。
在我们的云环境中,当部署新实例时,我们运行 集成测试。但是,它变得棘手,因为新代码正在为正在部署的服务在队列中注入消息,而现有实例(以前的版本)仍在 运行ning。我们有一个 blue/green 部署。
RabbitMQ 是否有可能让许多侦听器在队列上侦听但仅针对特定版本?
例如,所有 运行ning 服务器都会读取 2017.10.20(以前的版本)或更旧版本的消息,但不会读取较新版本的消息。
这样我就可以部署一个新服务,none 个其他 droplet 会读取它的测试消息。
正在部署的新服务与现有服务具有相同的功能。它生成和使用与当前 运行ning 服务相同的消息类型。
看起来您在同一个队列中混合了测试消息和生产消息。如果那是对的,我认为你应该把它们分开。
解决方案可能是 - 您将 publish/subscribe 的新服务部署到 integration test
不同于生产队列的队列集。当您对集成测试感到满意时,您可以将实例切换到 pub/sub 并进入生产队列(例如,通过向它们发送带有新 route/queue 名称的命令消息)或者只是使这些测试队列成为新的生产队列,并且淘汰旧的服务集及其队列。
例如:您的当前版本是 3.1,它 pubs/subs 在 queues/routes 上,如 my_command_a_3.1
、my_command_b_3.1
等。然后您部署一个新的 3.2 版本环境到 运行 与 3.1 版本并行。所有服务都在队列/路线 my_command_a_3.2
和 my_command_b_3.2
上运行。然后,当您对 3.2 版本感到满意时,您将淘汰 3.1 版本及其队列。您需要先清空这些队列(先关闭生产者,等待队列清空,然后关闭消费者)
我能想到的最接近你问题的直接答案:如果消费者不支持消息的版本,你可以让你的消费者 nack 一条消息(你需要将版本放在消息本身上),要求经纪人重新排队。然后在某个时候它将由新版本的消费者处理(在某个时候循环算法会将新消息传递给新消费者)。在我看来,这很脏,因为它会在代理端创建额外的无用工作,对于任何消息,您不知道它何时会被实际处理以及它会被重新排队多少次。