如果酷价项目采用 Spring Task 来实现定时任务, 想了一下,感觉会带来以下麻烦,大家交流一下。
1、目前项目都是多机器部署(至少两台), 在同样的打包命令下, 上线后定时任务会在部署的机器上同时运行, 等同于一个任务运行了多次。
当然可以采用以下方式解决:
a. 通过 maven profile 针对不同部署用途来对定时任务配置文件打包. 比如针对跑定时任务的服务器把定时任务配置文件打进去, 非定时任务的服务器就不打进去, 这样来保证只在一台机器运行。相当于之前 rails 项目, 选择特定机器执行 whenever -i
缺点: a.增加了运维工作量(需要清楚哪些机器跑定时任务)
b. 增加了上线复杂度,ads 复杂度, 多次打包意味着多次上线。时间成本也随之增加
c. 如何快捷监控? 又像之前 rails 项目一样, 写日志文件, 开始执行了、结束执行了。
d. 特别是当有人要求我们马上执行一下某个 task 时, 我们该怎么办? 改配置-> 打包-> 上线,但是上线重启时,其他正在运行的 task 又被重启。又影响其他任务。难道修改配置把其他 task 注释,打包-> 上线, 部署到新的服务器上面,把这个 task 执行一下???
总之,很烦,还很容易出错
b. 当然为了解决以上问题, 肯定会提出可以将定时任务单独放在一个项目里面。这样确实可以减少上面的某些缺点,但是这样带来的麻烦也不少, 并且上面缺点(c、d)同样没有解决。
缺点: a. 代码重复会比较严重, 一份代码在两个项目里面会存在。不利于企业级维护。
c. 当然为了解决以上问题,肯定会提出引入 maven 模块化, 将代码分成几个模块,比如 module service, module controller, module task ... 等等, Jenkins 打包配置时, 选择不同 module 来构建,可以减少核心代码(module service)不重复,但是我们现在的项目并不是这样构建的,并且 “当有人要求我们马上执行一下某个 task 时, 我们该怎么办?” 这个急需需求也没有解决啊,还是非常麻烦。
d. 不知道 spring task 还有没有其它招式可以解决?
我觉得不使用 taskengine, 使用 spring task 来替换,不能解决上面问题,不值得,会带来很多问题,增加复杂度。毕竟以上问题 taskengine 都己完美解决,带来的快捷和高效是有目共睹的。
taskengine 基于 Quartz 实现分布式任务管理和执行的, 并且 taskengine 在负载均衡方面做了大量工作,目前来看是一个非常好的工具平台。
工欲善其事 必先利其器, 领导在考虑 XXX 项目与 XXX 分开的同时,希望这些好用的工具平台能与 XXX 项目一同分享,或者多分点机器, 再部署一套 taskengine 也行。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于