请教下计时任务怎么实现,比如不同服务订单,分别在不同日期和时间段

比如 有几个服务器订单,分别在:

2021/02/28 20:00 2021/02/29 21:00 2021/02/29 21:01 2021/03/01 21:03 2021/03/02 21:05 到期

到期后触发短信、邮件发送到用户端。有点懵,请教下各位大佬,感谢。

墨楠小
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

首先感谢各位的回答,经过今天一整天的整理和查阅文档,场景:如我们买服务器一样,每次下单出现一个购买日期和到期日期,那么,到期将会释放服务器,这个触发条件是 每个订单的到期时间,定时任务解决会浪费大量服务器资源,假如百万条数据,按分钟处理不完数据,将会造成错乱。

查阅资料swoole中的计时器:wiki.swoole.com/#/timer 可以达到毫秒级处理,且计时器可以新增和销毁,完美满足需求。 新增定时器:wiki.swoole.com/#/event?id=defer 清除定时器:wiki.swoole.com/#/timer?id=clear

1个月前 评论
snower 1个月前
讨论数量: 24
  • 延时队列(延时时长不超过24小时)

    添加对列的时候,指定该任务触发的时间,到期后会自动执行。

  • 定时任务轮训

    使用任务调度功能,指定时间(1分钟、1小时.....)执行一个验证程序,查询需要处理的任务。

这2种方式各有优缺点,适合的场景也不同,具体使用其中某种或者都使用,要根据自己的业务场景来决定。

个人建议:

  1. 未支付的订单15分钟后自定关闭,这种建议使用延时队列的方式。
  2. 生日提醒,建议使用定时任务轮训,设计好表结构更好的触发即可。
  3. 还有一些需要这2种方式相结合,例如利用定时任务每天00:05查询当天要执行的任务,然后在批量添加到延时队列中。

结合业务特点,设计适合的模式更合理。

1个月前 评论

@一个人的江湖 好像任务调度无法到达目的,这个需要灵活处理订单,每次支付后,会出现一个到期时间,这个到期时间怎么去触发。

1个月前 评论

生成一个 job,传订单过去.然后设置 job delay 到期时间再处理之后处理 队列《Laravel 8 中文文档》

1个月前 评论

@Errorist 假如10天后的,就延迟10天吗 :flushed:

1个月前 评论

@lchola 比如服务器订单,6个月到期,那么延迟6个月吗?

1个月前 评论

@monanxiao 只要地球不爆照,队列没停,2038 年都可以

1个月前 评论

@lchola 我感觉这种处理方式并不友好,谢谢您,我再看看有没有其它解决办法。

1个月前 评论

设置一个 expired_at 批量读出来到期的批量处理呗。。

1个月前 评论

@crazy 不好意思,我没太理解处理方式,您可以详细点吗

1个月前 评论
  • 延时队列(延时时长不超过24小时)

    添加对列的时候,指定该任务触发的时间,到期后会自动执行。

  • 定时任务轮训

    使用任务调度功能,指定时间(1分钟、1小时.....)执行一个验证程序,查询需要处理的任务。

这2种方式各有优缺点,适合的场景也不同,具体使用其中某种或者都使用,要根据自己的业务场景来决定。

个人建议:

  1. 未支付的订单15分钟后自定关闭,这种建议使用延时队列的方式。
  2. 生日提醒,建议使用定时任务轮训,设计好表结构更好的触发即可。
  3. 还有一些需要这2种方式相结合,例如利用定时任务每天00:05查询当天要执行的任务,然后在批量添加到延时队列中。

结合业务特点,设计适合的模式更合理。

1个月前 评论

很简单,,你在订单那里,加一个到期时间,,是否已发送,..订算好就行了,,,,定时任务读取未发送,到期时间<=当前的

1个月前 评论

阿里云MQ消息队列,用个定时的,自己写一套太折腾了,还是交给第三方中间价比较好

1个月前 评论

没怎么看明白 详细描述一下具体的场景!才能回答这个问题!

1个月前 评论

@arvin-hermit 场景就像 云服务器释放,释放前3天每天提醒续费,到时间立即触发释放。

1个月前 评论

@ChaosKevin 这样确实可行,但是本身我们就是要解决问题的,而不是走捷径。

1个月前 评论

@24K大白羊 谢谢哈,这个方式也不太适合。

1个月前 评论

首先感谢各位的回答,经过今天一整天的整理和查阅文档,场景:如我们买服务器一样,每次下单出现一个购买日期和到期日期,那么,到期将会释放服务器,这个触发条件是 每个订单的到期时间,定时任务解决会浪费大量服务器资源,假如百万条数据,按分钟处理不完数据,将会造成错乱。

查阅资料swoole中的计时器:wiki.swoole.com/#/timer 可以达到毫秒级处理,且计时器可以新增和销毁,完美满足需求。 新增定时器:wiki.swoole.com/#/event?id=defer 清除定时器:wiki.swoole.com/#/timer?id=clear

1个月前 评论
snower 1个月前

楼主的方案个人并不赞成,本人也尝试过 swoole 的定时器,这种是不适合的,而且坑很多。一楼的答案 任务调度 是最简单可行的方案。

1个月前 评论

总感觉是钓鱼的

1个月前 评论

干过类似的需求 轮询+定时器

1个月前 评论

很简单 定期检查就行

1个月前 评论

看本身项目 是否有引入swoole了,如果为了这个需求专门 去用swoole特性,感觉没必要,一楼那种就行了

1个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!