在分布式系统中同步动作

Synchronize actions in a distributed system

什么techniques/tools可以用来实现具有这些需求的分布式系统:

这可以通过 RabbitMQ 并为不同的消息指定送达回执选项来完成。 sync 条消息应传送到所有节点,而 compute 条消息应由第一个看到它的节点确认。

Zookeeper 将是同步操作的好选择。假设以下方法。有一个 /sync znode,每次需要触发同步时,它都会使用当前时间戳或一些新数据进行更新。基本上,主节点更新 /sync 节点的值以触发工作节点上的操作。

工作节点监视 /sync znode 以获取数据更改。因此,每次主节点更新/同步时,工作节点都会收到通知并更新其本地缓存。

此外,工作节点在 /workers znode 下注册自己(通过在 /workers 下使用一些 uuid 创建临时 znode)。这些节点将是临时的,因此如果一个工作人员 node/process 死亡,相应的临时节点就会消失。 workers 在 /workers znode 下监视 childern,因此当新 worker 出现或任何现有 worker 消失时,他们会收到通知。此外,他们还监视 /workers 下所有临时节点的数据变化。

现在一切如何运作:

Master 使用当前时间戳更新 /sync 以触发工作节点上的同步。 所有工作人员都会收到有关 /sync 节点中数据更改的通知。他们获取 /sync 节点的修改数据。 工作人员从数据库同步他们的缓存。 工作人员在 /workers 节点下更新其相应的 znode。例如,id 为 4dc1efd2-01c8-11e5-bee1-08002791d032 的 worker 更新了 znode /workers/4dc1efd2-01c8-11e5-bee1-08002791d032。 放置在 worker 特定 znode 上的数据是 "synced_at_timestamp"(例如 synced_at_1432451046000) 每当任何工作人员更新其 znode 时,所有其他工作人员都会收到通知。 所有 worker 不断检查 /workers 下所有 znode 的当前数据。 当 /workers 下的所有 worker znode 都具有相同的数据synced_at_timestamp,它们切换到 IDLE 状态。

可能还有许多其他可能的方法。如果你熟悉memcache、redis、hazelcast等,你也可以用它们来实现这样的系统。