【发布时间】:2019-12-02 10:37:36
【问题描述】:
我们正在迁移我们的架构以利用 Symfony Messenger 组件。我目前正在处理的是调整我们应用程序的部署过程。
Symfony documentation 建议应在部署时重新启动工作人员以获取新代码。说得通。我的问题是,这并不能解决升级部署代码时的问题。考虑假设的版本 1 和 2。
版本 1 可以处理并理解一组特定的消息。
版本 2 添加了更多消息类型并更改了版本 1 中定义的一些消息类型的名称/结构/任何内容。
在部署期间,为了确保所有消息都被处理并且在新版本时没有不兼容,这是对我来说直观的过程:
- 停止接受新消息到队列(将站点置于“维护模式”)
- 让工作人员完成队列中待处理消息的处理
- 部署新代码
- 重启工作器
- 开始接受新消息
我面临的问题是我看不到任何方法来检查队列是否为空。
我的部署方案是否正确? 通常在使用 Symfony messenger 组件(或任何消息队列)的应用程序中部署是如何完成的?是确保所有消息类型向后兼容的唯一方法吗?
【问题讨论】:
-
有趣的问题。你有没有想过像"green/blue" deployment 这样的技巧来避免这些场景重叠?这将是完美的,因为您的策略是有风险的,例如,队列高度拥挤并且需要好几次才能清空(或类似情况)
-
谢谢,我想过类似的事情(虽然我不知道它有名字)。在停机时间是一个更大因素的大规模部署中,这可能是值得的投资。但是,在这一点上,对于我们来说,开销太大了,因为在工作时间之外部署时,我们可以接受最多几个小时的停机时间。在当前的部署规模下,我们的队列不会那么拥塞,所以这也不是一个紧迫的问题。
-
好的。顺便说一句,我已经检查过并声明“要执行此操作,请在部署时运行 messenger:stop-workers。这将向每个工作人员发出信号,表明它应该完成当前正在处理的消息并正常关闭。”在您提供的链接中,因此您可以轻松获得所需的内容。
-
我多年来一直有这个问题(使用 SimpleBus)。它本身并没有说明问题,但是我会看看如何在事件驱动系统中讨论这个问题,例如版本控制事件:infoq.com/news/2017/07/versioning-event-sourcing
-
Greg Young 也有一本书:leanpub.com/esversioning 就我个人而言,功能标志在我看来在某些命令场景中是有意义的。我只是不知道我对我所见过的这样做的技术有太多的欣赏。
标签: symfony message-queue