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 @   Tracydzf  阅读(329)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
历史上的今天:
2021-01-04 什么是覆盖索引?如何利用覆盖索引进行SQL语句优化?
2021-01-04 第六章—查询性能优化
2021-01-04 第五章—创建高性能的索引
点击右上角即可分享
微信分享提示