2012-11-14 30 views
1

我需要根据标识符(自动生成,数字,可重用)创建一个对象的分布式网络。如何在图形的每个节点上创建对象而不会产生冲突?通过网络的分布式标识符

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

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

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

回答

2

您可能会喜欢使用UUID s作为标识符,它们是独特的设计,因此您不需要任何额外的算法支持。

+0

这可能工作,但我担心的大小开销。在当前的实现中,我的标识符适合16位。 –

+0

它会比你使用的数量增加8倍 – bobah

0

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

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

更重要的是:如果节点随机选择他们的UUID,绝对不需要一个创建UUID并将节点赋予UUID的中央协调器。每个节点自己创建自己的UUID。

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,这可能是不够的。如果子网较小,那么计数器可用的位显然会增加,这或许足以解决问题。

+0

我喜欢这个想法,但是这对熵的重新分配承担了太多的责任。在我的应用程序中,节点可能负责创建所有对象,或者每个节点可能创建一个对象。也许调整标识符的大小是诀窍(到32位左右)。 –

+1

好点。我不知道为什么我假定对象创建将均匀分布在节点上。去32位可能允许使用硬件序列号的高位或节点唯一的东西,其余的位可能是日期+时间或持久计数器。 –