可以使用哪些技术/工具来实现具有以下要求的分布式系统:
在给定的时间,系统可以处于以下三种状态之一:同步,计算或空闲。
系统中的每个节点都可以接收两条指令:sync()和compute()。
sync()指令将立即发送到所有节点。收到sync()指令后,如果系统为IDLE,则每个节点应将其本地缓存与数据库同步,并且系统状态更改为SYNCING。当所有节点完成同步后,系统状态将更改为IDLE。万一节点发生故障,所有活动节点完成同步后,系统状态仍应更改为IDLE。
收到compute()指令后,如果系统未在同步,则节点将运行一些计算,并且系统状态应更改为COMPUTING。当计算完成时,或在发生节点故障的情况下,如果没有其他计算在进行中,则状态应更改为“空闲”。
Zookeeper将是同步动作的好选择。假设采用以下方法。有一个/ sync znode,每次需要触发同步时,该znode都会使用当前时间戳或一些新数据进行更新。基本上,主节点会更新/ sync节点的值以触发工作节点上的操作。
工作节点将监视/ sync znode上的数据更改。因此,每次主节点更新/同步时,工作人员都会收到通知,并更新本地缓存。
同样,工作程序节点在/ workers znode下注册自己(通过在/ workers下创建带有一些uuid的临时znode)。这些节点将是短暂的,因此,如果工作节点/进程死亡,则对应的短暂节点将消失。工人在/ workers znode下放置了一个监视孩子的手表,因此当新工人出现或任何现有工人消失时,他们会得到通知。此外,他们还监视/ workers下所有临时节点上的数据更改。
现在一切正常:
主服务器使用当前时间戳更新/ sync,以在工作节点上触发同步。所有工作程序都会收到有关/ sync节点中数据更改的通知。他们获取/ sync节点的修改后的数据。工作人员从数据库同步其缓存。工作程序在/ workers节点下更新其相应的znode。例如,标识为4dc1efd2-01c8-11e5-bee1-08002791d032的工作人员将更新znode / workers / 4dc1efd2-01c8-11e5-bee1-08002791d032。放置在工作程序特定的znode上的数据是“ synced_at_timestamp”(例如,synced_at_1432451046000)。只要任何工作程序更新其znode,就会通知所有其他工作程序。所有工作程序都会继续检查/ workers下所有znode上的当前数据。当/ workers下的所有worker znode具有相同的synced_at_timestamp数据时,它们将切换到IDLE状态。
可能还有许多其他可能的方法。如果您熟悉内存缓存,Redis,Hazelcast等,也可以使用它们来实现这样的系统。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句