celery延时队列实现

1.通过  普通队列超时时间设置(TTL)+ 死信交换机(DLX)+死信队列+消费者 实现;

普通队列 的消息设置超时时间,等 超时后,消息 会通过 死信交换机 路由到 死信队列,消费者 消费 死信队列中的 消息 从而实现延时队列功能;

 

 

 2.通过 rabbitmq插件rabbitmq-delayed-message-exchange 实现

celery实现方式

比较方便,通过  apply_async方法的 countdown属性 或 eta属性 实现(无论是 任务组 还是 单独任务 都可以); 但是 无法通过 delay() 方法实现 因为通过源码发现 delay不支持额外的参数 定制;

 

 

 apply_async实际 通过 countdown参数 调用 如下2种方式(通过设置 距离当前时间 的 过期 秒数):

task_chain.apply_async(countdown=10)
task_chain.apply_async(**{'countdown': 10})

或者 通过 eta参数 设置(通过 指定 具体的 时间点 触发); 

注意 时区问题

task_chain.apply_async(eta=action_time)

apply_async方法 参数注释如下:

celery实现延时队列注意点

1.  延时队列 为了 及时处理,最好 保证 消费者 能正常运行,及时处理 任务;如果 到达 预定时间 消费者没有启动,后来 启动时 也会 第一时间消费 任务(不会丢掉任务);

2. 延时任务 因为执行时间过长 导致 重复执行

3.如果想 通过 rabbitmq的 死信队列实现

4.延时队列 的及时性 问题 涉及到 消费者的 处理能力,不能保证 在准确的延期时间 一定 定时执行(如 15分钟后发送邮件通知,可能因为这种延时任务并发过多,可能出现 16分钟后才发送某个邮件);

 

posted @ 2022-01-04 16:56  Tracydzf  阅读(293)  评论(1编辑  收藏  举报