目前项目采用nginx+tomcat来做负载均衡,缺少一个分布式任务调度配置。任务调度在整个系统中是单点故障。为了解决这个问题,研究了一下zookeeper和redis。大家一致的解决方案是用分布式锁。通过zookeeper或者redis来构建一个锁实现。所有系统节点都能获取到这个锁的状态,作为一个共享锁,为系统调度提供分布式部署。
因为我的系统架构是spring架构。为了减少代码对系统的侵入,扩展spring的任务调度。将分布式任务调度机制写入自定义任务调度中。
<task:scheduled-tasks scheduler="zkScheduleManager">
<task:scheduled ref="taskObj" method="print" fixed-rate="5000"/>
</task:scheduled-tasks>
zkScheduleManager继承spring的
org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
在各个调度方法中写入分布式任务调度机制。
代码量比较大,下边说一下思路,后续把代码补上。
zookeeper维护server task两个文件夹。server存放连接的节点,task存放注册的任务
为了防止羊群效应每个服务器上维护一个EPHEMERAL_SEQUENTIAL类型节点。选取序列号最小的节点为主节点。
task节点按照任务名称/主节点id 形式注册到zookeeper
任务调度时利用反射机制构建任务,并获取task节点中的主节点id与当前节点id比对,是当前服务器进行相关任务调度。
来源:oschina
链接:https://my.oschina.net/u/237672/blog/534370