模型介绍
Master-Worker模式是常用的并行模式之一,它的核心思想是,系统有两个进程协作工作:Master进程,负责接收和分配任务;Worker进程,负责处理子任务。当Worker进程将子任务处理完成后,结果返回给Master进程,由Master进程做归纳汇总,最后得到最终的结果。
1.ZooKeeper中的master-worker实现
每个worker的监控与调度可以交给第三方工具去实现,比如Zookeeper便可以充当这样的角色,zookeeper是一个分布式文件系统,我们可以把worker挂载在它的/worker目录(结点)下,注意这个worker目录应该是一个临时的目录,且目录下的worker结点应该是有序的,但当worker挂掉后,又该如何知道它被分配了哪些任务呢,所以还应该有个/assign目录,记录worker结点已被分配的任务,当然,任务被挂载在/job结点下面,所以通过Zookeeper监控和调度时,应当有四个结点,三个角色。监听/job目录,如果该目录下的结点发生了变化,就将待分配的job分配给空闲的worker结点,而如何知道该worker是否空闲呢,就看其对应的assign节点是否为空,如果为空,便可继续分配。
private void onNodeChange(WatchedEvent event){
// event的类型为数量更新
if (Watcher.Event.EventType.NodeChildrenChanged != event.getType()) {
return;
}
try {
// 如果节点数量更新,那么遍历子节点,还没被处理的job
List<String> jobPathList = zooKeeper.getChildren("/job", false);
if (CollectionUtils.isEmpty(jobPathList)) {
return;
}
JobMessage initJobMessage = null;
String initJobPath = "";
for (String jobPath : jobPathList) {
String jobCurrentPath = "/job/" + jobPath;
byte[] jobDataByteArray = zooKeeper.getData(jobCurrentPath, false, null);
String jobData = new String(jobDataByteArray);
if (StringUtils.isEmpty(jobData)) {
continue;
}
// 将其转换为 jobMessage ,其中的status为 0 ,也就是没被分配的时候,才会分配
JobMessage jobMessage = JSON.parseObject(jobData, JobMessage.class);
if (jobMessage == null) {
continue;
}
//