可以使用哪些技术/工具来实现具有这些要求的分布式系统:
在给定时间,系统可以处于以下三种状态之一:同步,计算或空闲。
系统中的每个节点都可以收到两条指令:sync()和 计算()。
sync()指令将立即发送到所有节点。在获得sync()指令时,如果系统是IDLE,则每个节点应将其本地缓存与数据库同步,并且系统状态将更改为SYNCING。当所有节点完成同步后,系统状态将更改为IDLE。如果节点发生故障,只要所有活动节点完成同步,系统状态仍应更改为IDLE。
获取compute()指令后,如果系统不是SYNCING,则节点将运行某些计算,系统状态应更改为COMPUTING。当计算完成时,或者在节点发生故障的情况下,如果没有其他计算正在进行,则状态应该变为IDLE。
答案 0 :(得分:2)
Zookeeper将是同步操作的好选择。假设以下方法。有一个/ sync znode,每次需要触发同步时,都会使用当前时间戳或一些新数据进行更新。基本上,主节点更新/ sync节点的值以触发工作节点上的操作。
工作节点将监视/同步znode用于数据更改。因此,每次主节点更新/同步时,工作人员都会收到通知并更新其本地缓存。
此外,工作节点在/ workers znode下注册自己(通过使用/ workers下的某些uuid创建短暂的znode)。节点将是短暂的,因此如果工作节点/进程死亡,则相应的短暂节点消失。工作人员在工人znode下监视孩子,因此当新工人出现或任何现有工人消失时,他们会收到通知。此外,他们还在/ worker下的所有短暂节点上监视数据更改。
现在一切如何运作:
主控更新/与当前时间戳同步以触发工作节点上的同步。 所有工作人员都会收到有关/ sync节点中数据更改的通知。他们获取/ sync节点的修改数据。 工作人员从数据库中同步他们的缓存。 工作人员在/ workers节点下更新其对应的znode。例如,ID为4dc1efd2-01c8-11e5-bee1-08002791d032的worker更新了znode / workers / 4dc1efd2-01c8-11e5-bee1-08002791d032。 放在工作人员特定znode上的数据是“synced_at_timestamp”(例如synced_at_1432451046000) 每当任何工作人员更新其znode时,所有其他工作人员都会收到通知。 所有工作人员都会继续检查/ workers下所有znode的当前数据。 当/ workers下的所有worker znode具有相同的数据synced_at_timestamp时,它们会切换到IDLE状态。
可能还有许多其他可能的方法。如果您熟悉memcache,redis,hazelcast等,您也可以使用它们来实现这样的系统。
答案 1 :(得分:0)
这可以通过RabbitMQ完成,并为不同的消息指定送货回执选项。应将sync
个消息传递给所有节点,而第一个节点应确认compute
个消息以查看它。