由于最近有个监控系统,客户可以自由增加定时任务,目前已经1000多个,很多都是秒级任务 我发现时而不工作,时而卡死,进程还会嗝屁(不确定是不是我业务原因)
所以想冒昧请问一下: workerman/crontab 是否能承受几万个秒级的定时任务?有人测试过吗?
通过定时任务投递消息给任务队列,10W都没啥问题,只要你的消息进程足够多!
秒级任务需求这么多的吗
应该是N个用户 每个用户都设置了几个
系统自身几十个,然后用户就自定义添加任务,有N个用户添加了几十个 几百个
这种问题确实烧脑。
楼上的方法》通过定时任务投递消息给任务队列》这种方式应该可以试试。
不行的我现在就是,队列处理根本处理不过来
可以分发到别的服务器消费吗
暂时解决了。我换go来托管处理定时任务了。PHP我暂时还没有想到好方法
如果秒级任务,当定时任务达到10000个的时候,是不是意味着每秒要处理10000个任务?这个不简单呐
应该是我也不懂各种关系,我只知道 目前1000多个 系统各种毛病特别多。
你可以尝试一下 Wind 协程框架,一个进程负责任务分发,将任务以定时任务的形式放入消息队列,消息队列可以启多个进程,每个进程处理一两千个并发任务问题不大。
关键是你处理任务的能力,如果比较慢那不嗝屁都不行
我觉得你的业务逻辑需要重构,而不是靠那么多计划任务来处理。
对呀。使用消息对队不行吗
用户的需求是每秒执行一次任务,并不是要创建一个定时器Timer。
你可以预置几个粒度的定时器比如:1秒、10秒、30秒,并为每个粒度的定时器,创建一个Redis集合或哈希表 用户创建秒级任务时,把任务ID投放到秒级别的Redis集合或哈希表内。 每个粒度的定时器,按周期循环执行集合内的任务即可(可以丢到另外的worker进程执行)。
如果业务核心就是定时任务,可以了解一下时间轮算法。
时间轮概述 时间轮是一种高效来利用线程资源来进行批量化调度的一种调度模型。把大批量的调度任务全部都绑定到同一个的调度器上面,使用这一个调度器来进行所有任务的管理(manager),触发(trigger)以及运行(runnable)。能够高效的管理各种延时任务,周期任务,通知任务等等。 落实到workerman进程模型就是:1个管理进程用来做定时调度,N个执行器进程运行具体的任务
通过定时任务投递消息给任务队列,10W都没啥问题,只要你的消息进程足够多!
秒级任务需求这么多的吗
应该是N个用户 每个用户都设置了几个
系统自身几十个,然后用户就自定义添加任务,有N个用户添加了几十个 几百个
这种问题确实烧脑。
楼上的方法》通过定时任务投递消息给任务队列》这种方式应该可以试试。
不行的我现在就是,队列处理根本处理不过来
可以分发到别的服务器消费吗
暂时解决了。我换go来托管处理定时任务了。PHP我暂时还没有想到好方法
如果秒级任务,当定时任务达到10000个的时候,是不是意味着每秒要处理10000个任务?这个不简单呐
应该是我也不懂各种关系,我只知道 目前1000多个 系统各种毛病特别多。
你可以尝试一下 Wind 协程框架,一个进程负责任务分发,将任务以定时任务的形式放入消息队列,消息队列可以启多个进程,每个进程处理一两千个并发任务问题不大。
关键是你处理任务的能力,如果比较慢那不嗝屁都不行
我觉得你的业务逻辑需要重构,而不是靠那么多计划任务来处理。
对呀。使用消息对队不行吗
用户的需求是每秒执行一次任务,并不是要创建一个定时器Timer。
你可以预置几个粒度的定时器比如:1秒、10秒、30秒,并为每个粒度的定时器,创建一个Redis集合或哈希表
用户创建秒级任务时,把任务ID投放到秒级别的Redis集合或哈希表内。
每个粒度的定时器,按周期循环执行集合内的任务即可(可以丢到另外的worker进程执行)。
如果业务核心就是定时任务,可以了解一下时间轮算法。
时间轮概述
时间轮是一种高效来利用线程资源来进行批量化调度的一种调度模型。把大批量的调度任务全部都绑定到同一个的调度器上面,使用这一个调度器来进行所有任务的管理(manager),触发(trigger)以及运行(runnable)。能够高效的管理各种延时任务,周期任务,通知任务等等。
落实到workerman进程模型就是:1个管理进程用来做定时调度,N个执行器进程运行具体的任务