使用Chronos执行whenever任务

  • 时间:
  • 浏览:1
  • 来源:万人炸金花_万人炸金花官网

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

对于业务上时需定时执行的后台任务,大伙使用ruby的whenever模块定义执行时间及其对应的rake任务,之后将所有任务放上去一个 长期运行的docker容器,由上方的crond服务执行配置的cron任务。

以斜杠分隔的第二累积即为之后结束了了执行时间,第三累积为执行间隔时间,下一次应该哪此完后 执行时需从第二累积指定的时间之后结束了了计算的。为了保证每一次的执行时间都符合预期,这里时需一个 绝对时间作为之后结束了了执行时间。但又只能简单地设为过去某个时间点,意味着着着和chronos原来规则有关:当一个 任务部署后,chronos会判断其之后结束了了执行时间,肯能大于当前时间则等到了之后结束了了时间再执行任务,小于语句则立即执行一次任务。也倘若说,肯能之后结束了了时间为过去时间,只能任务每次被部署后时需被执行一次。

尽管要改造whenever任务,但大伙何必 打算抛弃whenever转而在业务层直接定义chronos支持的ISO 83001时间格式 。一是whenever五种 提供的DSL语法非常简单直观,对Ruby开发者更加友好;二是服务的运行环境对于业务层来说应该是透明的。大伙的做法是增加一个 解析模块,在部署的完后 将whenever的schedule.rb转换为多个chronos任务。

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

另外,受crontab的限制,whenever无法表示every(45.days)原来的时间,意味着着着是crontab中日期字段不在 0-31之间语句(0 0 */45 * *),最终的执行效果是每天执行一次。肯能只能用crontab表示每4三天执行一次,应该是原来的:

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

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

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

针对你很多间题,大伙将所有whenever任务拆分为短任务管理器运行运行运行在chronos上,每个任务单独配置资源,之后执行完毕立即退出,资源不要闲置。

不同于crontab默认经常从零时零分之后结束了了计算下次执行时间,chronos的schedule格式时需被委托人指定起始时间。

离米 是只能必要为你很多小众需求实现冗杂的逻辑,whenever会将4三天冗杂为一个 月。在chronos中则只能你很多间题,也能放心地使用原来的时间。

whenever中,何必 关注任务的名称。但在chronos中,每个rake都被拆分成了独立的任务,很多就时需一个 名字来标识每一个 任务。大伙使用rake办法的参数——rake task name——作为任务名,当然,时需处理特殊字符以及重名的情况。

大伙将形如10.minutes1.day以及1.month的时间表示定义为Fixnum的对应办法,最终其会被转换为秒数,这在rails中相当常见。在every()办法内拿到的间隔时间倘若转换完后 的秒数,之后对于25930000你很多数,它究竟是表示300.days天还是1.month呢?

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

好在这并时需一个 间题,肯能whenever也是原来处理的。whenever会将时间解析为尽肯能大的单位,之后25930000表示一个 月而时需300天。大伙在实现上沿用你很多逻辑。

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

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

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

大伙将schedule.rb中定义的所有任务拆分之后部署到chronos,肯能schedule.rb中某个任务被删除肯能改名了,只能旧的任务还保留在chronos中。对于你很多情况的处理,大伙在部署的完后 记录下本次部署的所有任务名,部署完成后遍历chronos上的所有任务,所有不在 本次部署中的任务则是时需删除的。

你很多基准时间的计算还是稍稍很多麻烦的:

五种 代码逻辑很简单,但依然有几点是时需注意。

在大伙将容器调度框架迁移到mesos+marathon完后 ,所有容器都时需设置资源配额。执行后台任务的容器闲置时白白占用了配额,之后配额的设置也只能以所有任务中最重的一个 为准,很多你很多办法造成了较大的资源浪费。

你很多解析器和whenever五种 的功能类似于,whenever将schedule.rb转换为crontab格式,大伙的解析器则将其转化为chronos支持的格式。