通过网络分布式标识符

时间:2012-11-14 08:36:46

标签: c++ networking synchronization distributed identity

我需要创建一个基于标识符(自动生成,数字,可重用)的对象分布式网络。如何在不产生碰撞的情况下在图形的每个节点上创建对象?

目前,我正在使用 master 节点来分配ID,但此解决方案涉及在其他节点上异步创建对象,我想删除它们。特别是因为应用程序是实时的,所以RDBMS是不行的。

我知道这是一个相当经典的分布式计算问题,但我可能缺乏正确搜索的词汇。

TCP是我可以使用的唯一协议,网络受到延迟的影响。如果它很重要,我正在使用C ++,但我正在寻找算法,而不是库。

3 个答案:

答案 0 :(得分:2)

您可能希望使用UUID作为标识符,它们在设计上是独一无二的,因此您不需要任何额外的算法支持。

答案 1 :(得分:2)

您可以让主节点一次为每个节点分配一个块或一系列ID,而不是主节点一次分配一个ID。然后,每个节点根据需要从该块中分配ID。

当节点的ID变低时,它会从主节点请求另一个块。这样,节点可以异步创建对象,并且仍然保证唯一ID。

我假设在删除对象时,ID会返回到池中以便重复使用。

如果您不希望主节点负责分发ID,则另一个选项是使用以太网MAC地址或附加计数器的IP地址来构成ID。这要求网络上不会出现重复的IP或MAC地址。该ID大于16位。

但是,如果所有节点都在同一网络上,例如IP地址AA.BB.CC.DD,然后您可以使用DD作为前8位,然后使用接下来的8位作为计数器。这样每个节点只能提供256个ID,这可能还不够。如果子网较小,那么计数器可用的位数显然会增加,这可能足以解决问题。

答案 2 :(得分:0)

随便创建它。随机值为128位,碰撞的可能性很小,你可以假设它为零。在128位uuid空间上,碰撞的概率是2 ^ 64(生日悖论)

显然你需要一个好的熵源,经典的sha1(time(NULL))是不行的;)

更重要的是:如果节点随机选择其UUID,则完全不需要为节点创建和提供UUID的中央协调器。每个节点自己创建自己的UUID。