【发布时间】:2019-11-20 13:27:26
【问题描述】:
我们希望在 kubenetes 集群中运行 Celery/Redis,目前没有启用 Redis 持久性(一切都在内存中)。我担心:Redis 重启(丢失内存中的数据)、worker 重启/中断(由于崩溃和/或 pod 调度)以及暂时的网络问题。
使用Celery使用Redis做任务处理时,需要什么保证任务的可靠?
【问题讨论】:
我们希望在 kubenetes 集群中运行 Celery/Redis,目前没有启用 Redis 持久性(一切都在内存中)。我担心:Redis 重启(丢失内存中的数据)、worker 重启/中断(由于崩溃和/或 pod 调度)以及暂时的网络问题。
使用Celery使用Redis做任务处理时,需要什么保证任务的可靠?
【问题讨论】:
在 redis 方面,只需确保您使用的是备份功能:
https://redis.io/topics/persistence
How to recover redis data from snapshot(rdb file) copied from another machine?
在 celery 方面,确保您的任务是幂等的。如果重新提交,则只运行一次。
如果任务正在处理中并且有重新启动。然后希望当 redis 和应用程序备份时,celery 会看到一个不完整的任务并尝试重新安排它。
【讨论】:
为了使您的 Celery 集群在使用 Redis 作为代理(和结果后端)时更加健壮,我建议使用一个(或多个)副本。不幸的是,redis-py 还不支持集群 Redis,但这只是时间问题。在复制模式下,当主服务器宕机时,副本会取而代之,这(几乎)是完全透明的。 Celery 还支持 Redis 哨兵。
多年来,Celery 在确保在某些关键情况下重新交付任务方面变得更加强大。如果任务因为worker丢失而失败(有一个配置参数),抛出一些异常等等 - 它将被重新传递,并再次执行。
【讨论】: