在 celery 中经常切换 redis 和 rabbitmq 是否可行?

Is it feasible to often switching between redis and rabbitmq in celery?

在生产中,当我们使用 redis 作为消息代理时,我们在 celery 中遇到了一些未知错误。所以我们考虑迁移到 rabbitmq,直到错误得到修复。这样将来如果其中任何一个有任何错误,我们可以在它们之间快速切换。这个想法是否可行,是否可以实现?

提前致谢

一般来说,传输是可以互换的,但有一些注意事项。当您在支持的代理之间交换时,Celery 将以相同的方式工作。然而,重要的是要了解 Celery 在您使用时为您提供哪些合约,以及哪些行为可能是特定于经纪人的。

注意事项:

  1. 一些芹菜settings/features取决于特定的交通工具。 (例如,broker_use_ssl设置只对redis和amqp有效,对rabbitmq无效)

  2. 不同broker默认不同settings/behavior(例如redis默认1小时可见超时,SQS默认使用30秒)

  3. 除了与 defaults 的差异之外,您的代理可以配置为完全独立于您的应用程序配置/celery 设置(例如,队列设置)创建 SQS 队列时)。

  4. 你必须考虑 data/message 损失的可能性。切换时,任何正在进行的消息或队列中的消息都将丢失。因此,您需要确保妥善处理交换以避免丢失消息——换句话说:在传输之间切换时,您需要迁移或重新传送任何现有消息。同样,现有的 rate limit 计数器不会过渡,消息去重机制不会传输等

  5. 必须重新启动工作器才能使代理更改生效。无法更改设置 'on-the-fly' 或自动响应错误。

所以,是的,一般来说,您可以随时更改传输。但是,这可能不是增加容错或自动故障转移的好策略,特别是因为注意事项 (4) 和 (5)。