网络上的分布式标识符
Distributed identifiers over network
我需要创建一个基于标识符(自动生成、数字、可重复使用)的分布式对象网络。如何在图形的每个节点上创建对象而不产生冲突?
目前,我使用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。
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- #ifdef和未声明的标识符
- f2、f3、f4标识符未找到
- 设置 Visual Studio for MPI: 找不到标识符错误
- 未声明的标识符编译暗黑破坏神 2 程序"muleview"
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- Google protobuf 时间戳未声明标识符,在 Windows 上具有C++
- 如何让 GCC/Clang 在保留标识符上出错
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- 当简单捕获中的标识符显示为参数的声明符 ID 时,没有编译器诊断
- 使用说明符 extern 声明的C++中的标识符链接
- C++:枚举:错误:应使用标识符而不是"}"
- 为什么我们不能重复使用具有不同模板参数的别名模板标识符?
- Visual Studio C++ PlaySound 标识符未定义
- 为什么我们不编写可以处理C++标识符的汇编器和链接器?
- 使用未声明的标识符"sqrt"?
- 找不到标识符合并
- 在模板化函数中重新定义(忽略)的 SWIG 标识符
- 在 c++ 中找不到此函数的标识符
- 网络上的分布式标识符