无状态worker可以基于订阅redis或kafka消息来实现。
不过我们这次用zk来搞一下,实现无状态、可容灾的任务分发系统。
1.准备三个持久节点:
/tasks // 任务list
/workers // 可用进程
/distribute // 已分配任务
2.划分角色职责
sender: 负责发布向/tasks节点发布任务
worker:负责执行任务
master: 负责将任务分发给worker执行,并关注执行状态
3.具体流程
各节点的类型:
1.sender创建的task,是PERSISTENT_SEQUENTIAL类型
2.worker注册的活跃节点,是EPHEMERAL_SEQUENTIAL类型
3.master分配任务时创建的/assign/worker_x/task_xxx节点,是EPHEMERAL类型
这里需要注意的是:
1.我们引入了worker空闲状态getData(/workers/work_xxx),用来关注worker的情况:
running-忙碌;
idle-空闲;
- 只有idle状态的worker可以被分配新任务
2.task的状态getData(/tasks/task_xxx)用来表示当前任务的状态: assign-已分配未执行;
running-执行中;
done-已完成;
null-未分配
- null状态的任务可以直接绑定某个worker执行&#