现在有一个情景,用户可以在页面上配置监听时间,配置完成后,需要通过定时读取 api 去获取数据,然后返回给用户。我的思路是通过用户的配置时间,动态的写入定时任务中,如何实现?还是有其他的思路来解决这个问题?
用 cron 执行定时任务,每 30 分钟把设置 30 分钟的用户任务推入任务队列,不同设置的用户用不同的 cron。不同设置的用户还可以区分不同队列。
任务 worker 就是来任务就执行,注意监控队列大小,任务增长速度大于处理速度就要加线程/进程/机器。
这么想呢,给每种频率分别开定时任务的 worker,间隔为他的频率,然后触发之后,从数据库里取相应频率的 task,然后处理
好处是简单,你不需要给每个 task 单独设置 crontab,如果 task 数量巨大的话,你可以先取出所有的 task 然后再分发到子 worker 处理,感觉也不是很复杂
我觉得从需求推导实现,有点复杂了。新浪微博,腾讯微博都有 API 的请求次数限制吧,你在限制以内,尽可能把用户的数据抓过来。数据在手了,然后按照用户所希望的方式显示给用户就好了。
我不太理解为什么要设置成 5 分钟或者 10 分钟或者更长时间这么复杂,难道数据同步不是越快越实时越好?
首先,你的定时请求去拿东西,是不是你页面 ui 里定时刷新的效果?
估计是。
就是用户选择刷新时间,存到数据库,每次用户打开界面,就去数据库拿到刷新的频率,用 js 写好定时刷新效果。
ajax 刷新去拿 api 的数据渲染,可以去你后台拿,然后你后台去 api 取返回浏览器。
以前做定时刷新 GPS 平台里的车辆实时信息,嘎嘎。
你没描述清楚的就是是否由用户打开某个网页时才有定时去抓取然后查看;还是,你后台定时去抓取,用户只一次打开浏览。
最简单的方法,数据库建立一个任务表,用户修改时间,就往这个表里面插入一条要具体在什么时间执行的记录。然后一个独立进程不停地查询这个表,看有什么记录已经超过了当前时间,执行一下,执行完以后,按用户设置的时间间隔,再插入一条。
常见的网页策略游戏都这么做,高端大气的就用个 KV store 或者消息队列。
根据不同的设置来创建定时任务,可行性不大,用户增多,定时任务会爆掉! 很是同意 @quakewang 方案,用户做个设置,增加条记录,记录包含时间间隔、下次执行时间等规则,另一进程不停查询这表中当前时间大于下次执行时间的记录,根据这条记录中规则请求 api,同时将下次执行时间设置为当前时间 + 时间间隔。
#11 楼 @quakewang #16 楼 @scys77 #17 楼 @kimigao1986 恩 这种方式应该挺好,而且维护数据库自己更容易控制,这个流程是不是可以这样,往数据库插入一条 5 分钟的记录并且设置执行时间为 5 分钟以后,进程轮询来扫描数据库的值,发现当前时间大于下次执行时间,就读取这条数据,并且按规则去调用 api,然后再将这条记录的执行时间设置成 5 分钟以后。
这个场景跟我想要做的有点像,我也来学习一下。 另外搭车问一下,有没有办法在 rails server 启动的时候同时把这个任务也开启,让它一直在后台跑?