我正在尝试创建一个分布式应用程序,该应用程序要求网络中的所有计算机同时执行事件。
假设我们有两个长度相等的数组。
labels[] = ["label1", "label2", "label3", ...]
duration[] = [0.5, 1.2, 0.1, 0.1, 3.0, ...]
我有一个主人,在局域网中有N个奴隶。假设阵列已被复制到所有从站。我现在想要的是在所有这些代码上运行以下代码。
for i in len(labels):
print labels[i]
sleep(duration[i])
我需要这些代码在客户端完全同时启动。
如何同时在所有客户端中触发'执行'事件?假设所有客户端都使用相同的NTP服务器同步,如果我要求他们在预定义的时间启动,那么准确度是否合理? duration[]
数组的时间元素可以小到0.1秒,我希望有一个合理的同时性。
答案 0 :(得分:2)
根据http://en.wikipedia.org/wiki/Network_Time_Protocol,“NTP通常可以在公共互联网上保持几十毫秒的时间,并且在理想条件下可以在局域网内实现优于1毫秒的精度。不对称路由和网络拥塞可能导致错误100毫秒或更长。“
因此,使用公共NTP服务器同步到100毫秒内是可行的,这可能是让这个工作起作用的最简单方法。
由于您在局域网上,您可以通过让主服务器向下属发送网络消息来了解当前时间,或者更简单地通过在LAN上运行您自己的NTP服务器来实现更好的性能并将您的群集指向它。
答案 1 :(得分:1)
正如其他人所写的那样,使用Internet NTP服务器可能会造成太大的延迟。
我看到两个选项:
答案 2 :(得分:0)
假设您在LAN上具有不错的性能特征,NTP的替代解决方案就是让主设备向接收方发送消息,以便在收到消息时执行所述任务。如果传输和处理的延迟在预期的“合理同时”范围内,它应该符合要求。根据架构(中断与轮询),系统负载和链路质量(无线),这可以合理地预期为<10毫秒。
此外,802.1q VLAN标准定义了第2层QoS(CoS标记),您可以利用它来确定交换机上此控制流量的优先级。
也许这种方法可以简化应用程序,方法是让一个更简单的“哑”从站 - 监听并响应命令 - 然后是一个拥有所有系统逻辑的主机。
答案 3 :(得分:0)
简短回答 - 恰好在同一时间 - 是不可能的。正如拉塞尔所写,NTP仅在100毫秒内准确。在局域网上运行可以测量通信延迟,在发送任务时,您可以在任务开始时添加超时。当您将其发送到N
个节点并且平均延迟为L
毫秒时,第一个节点在开始之前需要等待(N-1) * L
ms,第二个(N-2) * L
ms ...等等。最后一个会立即开始。
为了了解同步时钟的问题有多复杂,您可以在Spanner: Google's Globally-Distributed Database上阅读Google的研究论文。他们使用原子钟和GPS时钟在数据中心内在几纳秒内同步,在数据中心内同步几毫秒。