【问题标题】:Symfony Messenger - checking if queue is emptySymfony Messenger - 检查队列是否为空
【发布时间】: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


【解决方案1】:

这是一个有趣的挑战。

第 1 版(您在上一版本中发出的相同消息的新处理程序)

为此,您可以使用 Middleware 和 Stamps 将版本标头添加到通过传输发送的消息中。然后在消费端,您的处理程序可以观察版本标记并检查它是否对此消息负责。这种方法的好处是,您可以更改处理程序逻辑,而无需更改消息本身,只需让新代码将新版本添加到您之前发送的相同消息类型。

这可以很容易地引入现有的应用程序,方法是让您现有的处理程序查找印章,如果没有印章,则假定他们有责任并以其他方式退出。当新版本想要引入新的处理程序时,它将仅适用于您指定的任何版本,并忽略任何没有此标头的消息。

版本 2(修改数据结构)

解决此问题的一种方法是在每个版本之间仅对消息和处理程序进行向后兼容的更改。因此,例如假设您的消息看起来像这样:

{
    "foo": 123
}

你想把它改成这样:

{
   "bar": "123"
}

在这种情况下,您将首先发布一个包含旧字段和新字段的中间版本,一段时间后您可以发布删除旧逻辑的版本。消息的中间版本可能如下所示:

{
  "foo": 123,
  "bar": "123",
}

然后您将拥有一个处理程序,它首先检查bar,如果缺少bar,则回退到使用foo 和旧逻辑。这样,您可以确保新应用程序同时处理新旧消息,并且通过添加日志记录,您可以轻松查看何时不再调用旧代码,从而可以安全地在即将发布的版本中删除旧属性和逻辑。

这种方法的主要缺点是,您必须提前发现重大更改,这需要彻底的审查和测试过程。幸运的是,当您的处理程序遇到问题时,失败传输可以捕获问题,但如果无法正确解码消息,这些消息可能会立即被丢弃,所以要小心。

【讨论】:

  • 谢谢,这也是用于滚动更新和无缝回滚的方法。但正如您所注意到的,它在数据库模式更改设计方面进行了更多工作。不适用于我的团队,但对某些人来说仍然是一个很好的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
  • 2021-02-01
  • 2012-09-14
  • 1970-01-01
  • 1970-01-01
  • 2020-02-07
相关资源
最近更新 更多