场景描述
现有两种节点,分别是中心节点(Driver)和工作节点(Worker),中心节点负责调度工作节点。中心节点一般有1-3个,工作节点可有很多个。现在要实现Driver和Worker之间的通信,Driver发布命令后所有Worker都需要执行,并且Driver需要能获取到有哪些Worker执行完成了,哪些还未完成。
场景抽象
将命令抽象为一种消息,Driver为消息生产者,Worker为消息消费者
RabbitMQ是一种很常见的消息队列,其中的Topic模式可以实现消息的分发和接受,但是Driver无法获取到Worker执行的情况
Zookeeper也可以用来处理异步通信,Driver注册一个节点以后,Worker监听这个节点,然后做相应的操作来改变这个节点,Driver通过获取这个节点的信息,从而知道Worker的完成情况。
实现
1.driver创建节点,节点携带三类信息
- 待消费信息
- 哪些节点需要消费该信息-UNDOList
- 哪些节点完成消费(初始为空)-DONEList
2.worker监听,判断是否完成该操作,完成操作后将自己加入DONEList
3.driver监听,返回完成情况