gpt4 book ai didi

java - 分布式序列号生成?

转载 作者:IT老高 更新时间:2023-10-28 11:31:42 35 4
gpt4 key购买 nike

我过去通常使用数据库序列实现序列号生成

例如使用 Postgres SERIAL 类型 http://www.neilconway.org/docs/sequences/

我很好奇如何为没有数据库的大型分布式系统生成序列号。对于以线程安全方式为多个客户端实现序列号生成的最佳实践,有人有任何经验或建议吗?

最佳答案

好的,这是一个非常古老的问题,我现在第一次看到。

您需要区分序列号唯一 ID,它们(可选)可按特定标准(通常是生成时间)松散排序。真正的序列号意味着知道所有其他工作人员所做的事情,因此需要共享状态。以分布式、大规模的方式做到这一点并不容易。您可以查看网络广播、每个工作人员的窗口范围和 distributed hash tables for unique worker IDs 等内容。 ,但工作量很大。

唯一 ID 是另一回事,有几种以分散方式生成唯一 ID 的好方法:

a) 你可以使用 Twitter's Snowflake ID network service . 雪花是:

  • 联网服务,即您通过网络调用获取唯一 ID;
  • 生成按生成时间排序的 64 位唯一 ID;
  • 并且该服务具有高度可扩展性和(可能)高度可用;每个实例每秒可以生成数千个 ID,您可以在 LAN/WAN 上运行多个实例;
  • 用 Scala 编写,在 JVM 上运行。

b) 您可以使用源自how UUIDs方法在客户端自身上生成唯一ID。和 Snowflake 的 ID。 有多种选择,但大致如下:

  • 最重要的 40 位左右:时间戳; ID 的生成时间。 (我们使用时间戳的最高有效位来使 ID 可以按生成时间排序。)

  • 接下来的 14 位左右:每个生成器的计数器,每个生成器都会为每个生成的新 ID 加 1。这样可以确保在同一时刻(相同的时间戳)生成的 ID 不会重叠。

  • 最后 10 位左右:每个生成器的唯一值。使用它,我们不需要在生成器之间进行任何同步(这非常困难),因为所有由于这个值,生成器会生成不重叠的 ID。

c) 您可以在客户端上生成 ID,只使用 时间戳和随机值。这样就无需了解所有生成器,并为每个生成器分配一个唯一值。另一方面,这些 ID 并不能保证在全局范围内是唯一的,它们只是极有可能是唯一的。 (为了碰撞,一个或多个生成器必须在完全相同的时间创建相同的随机值。)类似于:

  • 最高32位:时间戳,ID的生成时间。
  • 最低有效 32 位:32 位随机性,为每个 ID 重新生成。

d) 简单的出路,use UUIDs / GUIDs .

关于java - 分布式序列号生成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2671858/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com