网络上的分布式标识符

Distributed identifiers over network

本文关键字:标识符 分布式 网络      更新时间:2023-10-16

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

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

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

TCP是我唯一可以使用的协议,而且网络会延迟。如果重要的话,我在C++中工作,但我在寻找算法,而不是库。

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

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

当一个节点的ID不足时,它会向主节点请求另一个块。通过这种方式,节点可以异步创建对象,并且仍然具有保证的唯一ID。

我假设当对象被删除时,ID会返回到池中以供重用。

如果您不希望主节点负责分发ID,另一种选择是使用以太网MAC地址或附加计数器的IP地址来组成ID。这要求网络上不显示重复的IP或MAC地址。该ID将大于16位。

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

只需随机创建即可。对于128位的随机值,发生碰撞的可能性非常小,您可以假设它为零。在128位uuid空间上,碰撞的概率是2^64(生日悖论)

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

更重要的是:如果节点随机选择UUID,那么绝对不需要创建UUID并将其提供给节点的中央协调器。每个节点自己创建自己的UUID。