在上一篇中,我们讲解了如何使用Java来操作ZooKeeper,链接为 ZooKeeper完全解析(三) 使用Java操作ZooKeeper,这一篇中,我们将会讲解使用ZooKeeper来实现一个分布式的作业调度系统的原理。
众所周知,ZooKeeper可以看成一个分布式的文件系统,所以可以根据这个文件系统来完成一些角色的分配与任务的分配,比如分布式的作业调度系统。
试想一下,一个作业调用系统需要几种角色呢?简单来说,需要三种。
1、执行任务的角色,我们把它称为 slave 节点,也就是,当发现有任务分配到自己的时候,执行此任务,然后改变此任务的状态
2、分配任务的角色,我们把它称为 master 节点,当发现有新任务的时候,分配给空闲的 slave 节点,让 slave 节点去执行
3、剩下的当然就是产生新任务的角色,也就是我们的使用者。当需要使用系统的时候,写入新的 job ,然后就等待这个 job 的状态改变即可。
说完了角色之后,就是分配节点,也就是 /assign 节点, slave 节点不仅会在 /slave 节点下面来创建一个顺序节点,也会在 /assign 中创建一个节点,当 master 发现有任务的时候,将 job 分配到 /assign 的 /slave 节点下面,可能有人有疑问?为什么不直接分配到 /slave 节点里面呢?因为 /slave 一定是一个顺序的、临时的节点(当对应slave节点宕掉的时候会自动删除