如何使用RabbitMQ处理蓝/绿部署?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用RabbitMQ处理蓝/绿部署?相关的知识,希望对你有一定的参考价值。

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

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

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

这样我可以部署一个新服务,其他任何一个小滴都不会读取它的测试消息。

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

答案

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

例如:你有版本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成为一条消息,要求经纪人重新排队。然后在某些时候它将由新版本的消费者处理(在某些时候,循环算法将把新消息传递给新的消费者)。在我看来这很脏,因为它在代理方面创造了额外的无用工作,对于任何消息,你不知道它何时会被实际处理以及它将被重新排队多少次。

以上是关于如何使用RabbitMQ处理蓝/绿部署?的主要内容,如果未能解决你的问题,请参考以下文章

Spark 结构化流式蓝/绿部署

如何在 AWS 中使用 Terraform 实施蓝/绿部署而不损失容量

蓝绿部署与滚动部署?

具有 ECS 蓝/绿部署的 AWS CodePipeline 失败并出现内部错误 |拿 2

使用 Auto Scaling 组、CloudFormation 和 CodeDeploy 的蓝/绿部署

AWS Lambda 和 Gateway API - 使用 cloudformation 的蓝/绿部署