我一般都实现了序列号生成过去使用数据库序列。
例如使用 Postgres SERIAL 类型http://www.neilconway.org/docs/sequences/ http://www.neilconway.org/docs/sequences/
我很好奇如何为没有数据库的大型分布式系统生成序列号。有没有人有任何关于实现序列号生成的最佳实践的经验或建议?线程安全多个客户端的方式?
好吧,这是一个非常古老的问题,我现在第一次看到。
你需要区分序列号 and 唯一ID可以(可选)按特定标准(通常是生成时间)松散排序。真正的序列号意味着了解所有其他工作人员所做的事情,因此需要共享状态。没有简单的方法可以以分布式、大规模的方式做到这一点。您可以研究诸如网络广播、每个工作人员的窗口范围之类的内容,以及用于唯一工作 ID 的分布式哈希表 http://horicky.blogspot.com/2007/11/distributed-uuid-generation.html,但工作量很大。
唯一 ID 是另一回事,有几种以分散方式生成唯一 ID 的好方法:
a)你可以使用Twitter 的 Snowflake ID 网络服务 https://blog.twitter.com/2010/announcing-snowflake.雪花是:
- 网络服务,即您进行网络调用以获得唯一的ID;
- 它产生按生成时间排序的 64 位唯一 ID;
- 该服务具有高度可扩展性和(潜在)高可用性;每个实例每秒可以生成数千个 ID,并且您可以在 LAN/WAN 上运行多个实例;
- 用 Scala 编写,在 JVM 上运行。
b) 您可以使用以下方法在客户端本身生成唯一的 ID:方法源自UUID 如何 http://en.wikipedia.org/wiki/Universally_Unique_Identifier雪花的ID就制作完成了。有多种选择,但大致如下:
最重要的 40 位左右:时间戳;ID的生成时间。 (我们使用时间戳的最高有效位来使 ID 可按生成时间排序。)
接下来的 14 位左右:每个发电机计数器,对于每个生成的新 ID,每个生成器都会加一。这可确保同一时刻(相同时间戳)生成的 ID 不会重叠。
最后 10 位左右:每个生成器都有一个唯一的值。使用这个,我们不需要在生成器之间进行任何同步(这非常困难),因为所有生成器都会因为这个值而生成不重叠的 ID。
c) 您可以在客户端上生成 ID,只需使用时间戳和随机值。这避免了了解所有生成器并为每个生成器分配唯一值的需要。另一方面,此类 ID 并不保证要想在全球范围内独一无二,它们只是非常有可能是独一无二的。 (为了发生碰撞,一个或多个生成器必须在完全相同的时间创建相同的随机值。)大致如下:
- 最高有效 32 位:时间戳,ID的生成时间。
- 最低有效 32 位:32 位随机性,为每个 ID 重新生成。
d) 简单的出路,使用 UUID / GUID http://en.wikipedia.org/wiki/Universally_Unique_Identifier.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)