zookeeper实现分布式任务调度系统

喜你入骨 提交于 2020-02-28 20:48:07

        目前项目采用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;

在各个调度方法中写入分布式任务调度机制。

代码量比较大,下边说一下思路,后续把代码补上。

  1. zookeeper维护server task两个文件夹。server存放连接的节点,task存放注册的任务

  2. 为了防止羊群效应每个服务器上维护一个EPHEMERAL_SEQUENTIAL类型节点。选取序列号最小的节点为主节点。

  3. task节点按照任务名称/主节点id  形式注册到zookeeper

  4. 任务调度时利用反射机制构建任务,并获取task节点中的主节点id与当前节点id比对,是当前服务器进行相关任务调度。





易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!