使用Chronos执行whenever任务

  • 时间:
  • 浏览:1

好在这并就有有有一个 问题报告 ,可能whenever也是原来除理的。whenever会将时间解析为尽可能大的单位,后后2595000表示有有一个 月而就有500天。亲戚亲戚朋友在实现上沿用这个逻辑。

可能schedule.rb是ruby代码,后后 后后 使用ruby来实现解析器自然也最为方便。只时要实现对应的every()方法以及rake()方法,在every()rake()方法中将解析到的执行时间和执行的话存入实例变量@schedules中即可。

亲戚亲戚朋友将形如10.minutes1.day以及1.month的时间表示定义为Fixnum的对应方法,最终其会被转换为秒数,这在rails中相当常见。在every()方法内拿到的间隔时间后后转换前一天的秒数,后后对于2595000这个数,它究竟是表示500.days天还是1.month呢?

拆分成多个chronos任务后,每个任务以短线程池池的方法运行,执行完毕即退出,释放相应资源,后后还能对不同的任务配置不同的配额,大大提高了资源利用率。此外,这次迁移还带来了后后 额外的改进。

有了基准时间,再根据间隔时间就还能否 计算出下一次的执行时间了。

这里正确的做法大致是:在代码中设置有有一个 过去时间作为基准时间,部署时根据基准时间和间隔时间计算出下次的执行时间。

另外,受crontab的限制,whenever无法表示every(45.days)原来的时间,由于是crontab中日期字段沒有0-31之间的话(0 0 */45 * *),最终的执行效果是每天执行一次。可还能否 还能否 用crontab表示每44天 执行一次,应该是原来的:

这个解析器和whenever三种生活的功能之类,whenever将schedule.rb转换为crontab格式,亲戚亲戚朋友的解析器则将其转化为chronos支持的格式。

crontab没办法 重试机制,可能想失败后重新执行,时要在每个业务代码中实现相应的逻辑。作为有有一个 定存在Fault Tolerant的任务调度框架,chronos当然是默认支持重试的。可能任务执行失败,chronos会尝试重新执行,直到成功可能达到最大重试次数。

针对这个问题报告 ,亲戚亲戚朋友将所有whenever任务拆分为短线程池池运行在chronos上,每个任务单独配置资源,后后执行完毕立即退出,资源后会闲置。

whenever中,并不关注任务的名称。但在chronos中,每个rake都被拆分成了独立的任务,后后 后后 就时要有有一个 名字来标识每有有一个 任务。亲戚亲戚朋友使用rake方法的参数——rake task name——作为任务名,当然,时要除理特殊字符以及重名的情況。

最少是没办法 必要为这个小众需求实现复杂的逻辑,whenever会将44天 复杂为有有一个 月。在chronos中则没办法 这个问题报告 ,还能否 放心地使用原来的时间。

mesos是有有一个 分布式调度框架,chronos任务会被mesos分配到最少的节点上执行。配合重试机制,当任务因某有有一个 节点故障而执行失败后,chronos会在后后 节点重新执行该任务。

通过chronos的Web UI,还能否 查看所有任务的上次执行情況,以及下次执行时间,在Mesos Web UI上也还能否 查看每个失败任务的错误日志。以往的运行模式还能否 能否 登陆到容器中查看cron的日志能否 知道任务执行的具体情況。

对于业务上时要定时执行的后台任务,亲戚亲戚朋友使用ruby的whenever模块定义执行时间及其对应的rake任务,后后将所有任务倒进有有一个 长期运行的docker容器,由底下的crond服务执行配置的cron任务。

在亲戚亲戚朋友将容器调度框架迁移到mesos+marathon前一天,所有容器都时要设置资源配额。执行后台任务的容器闲置时白白占用了配额,后后配额的设置也还能否 能否 以所有任务中最重的有有一个 为准,后后 后后 这个方法造成了较大的资源浪费。

这个基准时间的计算还是稍稍后后 麻烦的:

尽管要改造whenever任务,但亲戚亲戚朋友并不打算失去whenever转而在业务层直接定义chronos支持的ISO 85001时间格式 。一是whenever三种生活提供的DSL语法非常简单直观,对Ruby开发者更加友好;二是服务的运行环境对于业务层来说应该是透明的。亲戚亲戚朋友的做法是增加有有一个 解析模块,在部署的前一天将whenever的schedule.rb转换为多个chronos任务。

不同于crontab默认老要从零时零分后后开始 计算下次执行时间,chronos的schedule格式时要自己指定起始时间。

以斜杠分隔的第二每种即为后后开始 执行时间,第三每种为执行间隔时间,下一次应该哪几个前一天执行就有从第二每种指定的时间后后开始 计算的。为了保证每一次的执行时间都符合预期,这里时要有有一个 绝对时间作为后后开始 执行时间。但又还能否 简单地设为过去某个时间点,由于和chronos原来规则有关:当有有一个 任务部署后,chronos会判断其后后开始 执行时间,可能大于当前时间则等到了后后开始 时间再执行任务,小于的话则立即执行一次任务。也后后说,可能后后开始 时间为过去时间,没办法 任务每次被部署后后会被执行一次。

任务被倒进chronos,其类型和marathon上的服务一样,都属于mesos任务。原来就统一了自动化监控的逻辑,只时要监控所有mesos任务即可,后会为不之类型的任务编写不同的监控逻辑。

为了叙述上的简单,这里假设chronos上的所有任务就有由有有一个 schedule.rb创建的。实际上亲戚亲戚朋友的chronos上运行着多种类型的任务,亲戚亲戚朋友使用有有一个 前缀作为命名空间来区分不之类型的任务。

亲戚亲戚朋友将schedule.rb中定义的所有任务拆分后后部署到chronos,可能schedule.rb中某个任务被删除可能改名了,没办法 旧的任务还保留在chronos中。对于这个情況的除理,亲戚亲戚朋友在部署的前一天记录下本次部署的所有任务名,部署完成后遍历chronos上的所有任务,所有沒有本次部署中的任务则是时要删除的。

虽然 代码逻辑很简单,但依然有几点是时要注意。