我打算编写一个具有分布式工作进程的应用程序。其中之一将是领导者,它将任务分配给其他进程。设计领导者选举过程非常简单:每个过程都尝试在同一路径中创建一个临时节点。谁成功,谁就成为领导者。
现在,我的问题是如何设计平均分配任务的过程?有什么食谱吗?
我将详细说明环境设置:
假设有 10 台 worker 机器,每台运行一个进程,其中一台成为 leader。任务在队列中提交,Leader 接受它们并分配给工作人员。每当提交任务时,工作进程都会收到通知。
我打算编写一个具有分布式工作进程的应用程序。其中之一将是领导者,它将任务分配给其他进程。设计领导者选举过程非常简单:每个过程都尝试在同一路径中创建一个临时节点。谁成功,谁就成为领导者。
现在,我的问题是如何设计平均分配任务的过程?有什么食谱吗?
我将详细说明环境设置:
假设有 10 台 worker 机器,每台运行一个进程,其中一台成为 leader。任务在队列中提交,Leader 接受它们并分配给工作人员。每当提交任务时,工作进程都会收到通知。
我不确定我是否了解您的领导者选举算法,但推荐的实现方式是使用顺序临时节点并使用http://zookeeper.apache.org/doc/r3.3.3/recipes.html#中的算法sc_leaderElection解释了如何避免“羊群”效应。
任务的分发可以通过一个简单的分布式队列来完成,并不严格需要一个 Leader。生产者将任务排入队列,消费者在任务节点上保持监视 - 触发的监视将引导消费者接受任务并删除关联的 znode。从失败的消费者重新排队任务时需要考虑某些边缘条件。http://zookeeper.apache.org/doc/r3.3.3/recipes.html#sc_recipes_Queues
我会推荐Example: Master-Worker Application
这本书的部分ZooKeeper Distributed Process Coordination
http://shop.oreilly.com/product/0636920028901.do
该示例演示了使用 znodes 和常见的 zookeeper 命令将任务分配给 worker。
考虑使用演员单例服务模式。例如,在 Scala 中有Akka,它用更少的代码解决了这类问题。