【问题标题】:How to handle blue/green deployment with RabbitMQ?如何使用 RabbitMQ 处理蓝/绿部署?
【发布时间】:2018-06-01 08:09:05
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您的新服务是否正在部署:产生消息?消费消息?两者都有?
  • 两者。新服务的行为与现有服务相同。我会更新问题。

标签: testing rabbitmq integration amq


【解决方案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 一条消息,要求代理重新排队它。然后在某个时候它将由新版本的消费者处理(在某个时候循环算法将把新消息传递给新的消费者)。在我看来,这很脏,因为它在代理端产生了额外的无用工作,对于任何消息,您都不知道它什么时候会被实际处理,以及它会被重新排队多少次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-08
    • 2019-01-01
    • 2021-07-18
    • 1970-01-01
    • 2015-07-21
    • 2019-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多