涉及队列时的金丝雀发布

涉及队列时的金丝雀发布

福勒说当旧版本仍在运行时,一小部分流量被路由到 Canary 版本。

这是假设路由可以在负载均衡器/路由器级别进行控制。

我们有一个用例,其中微服务使用队列并进行一些处理。我们想知道如何控制路由以将一部分流量导向金丝雀消费者。

我们考虑的选项之一是设立一个单独的“金丝雀队列”,但问题是生产者现在必须意识到这个听起来有点怪异的队列。

这似乎是涉及队列的常见问题。关于 Canary 如何应用于此类应用程序,您有什么想法吗?

答案1

您要解决的更重要的问题是如何处理在处理队列中的项目时死亡的工人。

当一个 worker 正在处理一个项目时,您通常不希望它仍在队列中供其他 worker 处理。另一方面,如果该项目从队列中移除,并且只有 worker 知道正在处理该项目,那么如果 worker 崩溃,该信息将会丢失。

了解某个 worker 是否崩溃也很棘手。通常,超时可以作为判断 worker 是否崩溃的足够好的近似值。但是,您要允许多少个 worker 尝试处理该项目。如果您有一个与数据相关的错误,则存在在不同的 worker 上重试只会导致下一个 worker 死亡的风险。如果您不考虑这一点,您的所有 worker 都可能崩溃。另一方面,如果某个 worker 因硬件故障而崩溃,您可能不想丢失它当时正在处理的项目。

如果你已经解决了上述所有问题,那么你已经解决了与金丝雀相关的大部分风险。此时,你可以决定让金丝雀像其他工人一样行事。

但是,新版本也存在输出损坏数据的潜在风险。如果处理是确定性的,那么您可以允许旧版本和金丝雀处理相同的输入并比较输出。如何实现取决于您的整体系统设计,在某些系统中,解决方案可能是让工作人员将一小部分已处理的项目插入金丝雀队列,您的金丝雀可以再次进行相同的处理,然后您可以比较结果。

答案2

使用队列工作者进行金丝雀部署有两种方法,即使用:

  1. 专用的金丝雀队列
  2. Canary 和非 Canary 工作者共用一个队列

这两种方法都有各自的优点和缺点,下面将详细介绍:http://www.varlog.co.in/blog/canary-deployment-workers/

相关内容