我需要创建一个基于标识符(自动生成、数字、可重用)相互通信的分布式对象网络。如何在图形的每个节点上创建对象而不产生冲突?
目前,我使用主节点来分配 ID,但此解决方案涉及在其他节点上异步创建对象,我想将其删除。特别是因为应用程序是实时的,所以 RDBMS 是不行的。
我知道这是一个相当经典的分布式计算问题,但我可能缺乏正确搜索的词汇。
TCP 是我可以使用的唯一协议,并且网络存在延迟。万一这很重要,我正在使用 C++,但我正在寻找一种算法,而不是库。
我需要创建一个基于标识符(自动生成、数字、可重用)相互通信的分布式对象网络。如何在图形的每个节点上创建对象而不产生冲突?
目前,我使用主节点来分配 ID,但此解决方案涉及在其他节点上异步创建对象,我想将其删除。特别是因为应用程序是实时的,所以 RDBMS 是不行的。
我知道这是一个相当经典的分布式计算问题,但我可能缺乏正确搜索的词汇。
TCP 是我可以使用的唯一协议,并且网络存在延迟。万一这很重要,我正在使用 C++,但我正在寻找一种算法,而不是库。
您可以让它一次为每个节点分配一个块或一系列 ID,而不是主节点一次分配一个 ID。然后每个节点根据需要从该块内分配 ID。
当一个节点的 ID 变低时,它会向主节点请求另一个块。通过这种方式,节点可以异步创建对象,并且仍然有保证的唯一 ID。
我假设当对象被删除时,ID 会返回到池中以供重复使用。
如果您不希望主节点负责分配 ID,另一种选择是使用以太网 MAC 地址或 IP 地址等附加计数器来组成 ID。这要求网络上不会出现重复的 IP 或 MAC 地址。此 ID 将大于 16 位。
但是,如果所有节点都在同一个网络上,例如 IP 地址 AA.BB.CC.DD,那么您可以使用 DD 作为前 8 位,然后使用接下来的 8 位作为计数器。这只会为每个节点提供 256 个 ID,这可能还不够。如果子网更小,那么计数器可用的位数显然会增加,也许这足以解决问题。
您可能喜欢使用UUID作为标识符,它们在设计上是独一无二的,因此您不需要任何额外的算法支持。
只是随机创建它。使用 128 位的随机值,发生冲突的机会非常小,您可以假设它为零。在 128 位 uuid 空间上,碰撞概率为 2^64(生日悖论)
显然你需要一个好的熵源,经典sha1(time(NULL))
是不行的;)
更重要的是:如果节点随机选择它们的 UUID,则绝对不需要中央协调器来创建 UUID 并将其提供给节点。每个节点自己创建自己的 UUID。