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. 延时任务 因为执行时间过长 导致 重复执行
4.延时队列 的及时性 问题 涉及到 消费者的 处理能力,不能保证 在准确的延期时间 一定 定时执行(如 15分钟后发送邮件通知,可能因为这种延时任务并发过多,可能出现 16分钟后才发送某个邮件);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
2021-01-04 什么是覆盖索引?如何利用覆盖索引进行SQL语句优化?
2021-01-04 第六章—查询性能优化
2021-01-04 第五章—创建高性能的索引