【发布时间】:2022-01-04 05:43:36
【问题描述】:
在生产中,当我们使用 redis 作为消息代理时,我们会遇到一些在 celery 中发生的未知错误。所以我们考虑迁移到rabbitmq,直到错误得到修复。这样以后,如果其中任何一个有任何错误,我们都可以在它们之间快速切换。这个想法是否可行,是否有可能实现?
提前致谢
【问题讨论】:
标签: python redis rabbitmq celery messagebroker
在生产中,当我们使用 redis 作为消息代理时,我们会遇到一些在 celery 中发生的未知错误。所以我们考虑迁移到rabbitmq,直到错误得到修复。这样以后,如果其中任何一个有任何错误,我们都可以在它们之间快速切换。这个想法是否可行,是否有可能实现?
提前致谢
【问题讨论】:
标签: python redis rabbitmq celery messagebroker
一般来说,是的,传输是可以互换的,但有一些注意事项。当您在支持的经纪人之间进行交换时,Celery 的工作方式相同。然而,了解 Celery 在您使用时为您提供了哪些合约以及哪些行为可能是特定于代理的,这一点很重要。
注意事项:
某些 celery 设置/功能取决于特定的传输方式。 (例如broker_use_ssl设置只对redis和amqp有效,对rabbitmq无效)
不同的代理有不同的默认设置/行为(例如,redis 默认为 1 小时可见性超时,SQS 默认使用 30 秒)
除了与 默认值 的差异之外,您的代理可以配置为完全独立于您的应用程序配置/芹菜设置(例如,创建 SQS 队列时的队列设置)。
您必须考虑数据/消息丢失的可能性。当您切换时,队列中的任何正在进行的消息或消息都将丢失。因此,您需要确保优雅地处理交换以避免丢失消息——或者换句话说:当您在传输之间切换时,您需要迁移或重新传递任何现有消息。同样,现有的rate limit 计数器不会转换,消息重复数据删除机制也不会转换,等等。
必须重新启动工作器才能使代理更改生效。设置不能“即时”更改或自动响应错误。
所以,是的,您可以随时更改传输方式。但是,这可能不是增加容错或自动故障转移的好策略,尤其是因为注意事项 (4) 和 (5)。
【讨论】: