问题

我一般在过去使用数据库序列实现了序列号生成。

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

#1 热门回答(105 赞)

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

你需要区分序列号和唯一ID,这些ID(可选)可以按特定条件(通常为生成时间)进行松散排序。真正的序列号意味着知道所有其他工作者所做的事情,因此需要共享状态。没有简单的方法以分布式,高规模的方式这样做。你可以查看网络广播,每个工作人员的窗口范围以及distributed hash tables for unique worker IDs等内容,但这需要做很多工作。

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

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

网络服务,即你进行网络呼叫以获取唯一ID;

产生按生成时间排序的64位唯一ID;

该服务具有高度可扩展性和(可能)高度可用性;每个实例每秒可以生成数千个ID,你可以在LAN / WAN上运行多个实例;

用Scala编写,在JVM上运行。

b)你可以使用从how UUIDs派生的方法在客户端本身生成唯一ID,并制作Snowflake的ID。有多种选项,但有些内容如下:

最重要的40位左右:时间戳; ID的生成时间。 (我们使用时间戳的最高位来按生成时间对ID进行排序。)

接下来的14个位:每个发生器计数器,每个生成器为每个生成的新ID递增1。这可确保在同一时刻生成的ID(相同时间戳)不重叠。

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

c)你可以使用a**时间戳和随机值在客户端上生成ID。**这样就无需了解所有生成器,并为每个生成器分配一个唯一值。另一方面,这些ID不保证是全球唯一的,它们很可能是唯一的。 (要碰撞,一个或多个生成器必须在同一时间创建相同的随机值。)以下内容:

最重要的32位:时间戳,ID的生成时间。

最低有效32位:32位随机性,为每个ID重新生成。

#2 热门回答(15 赞)

你可以让每个节点都有一个唯一的ID(无论如何都可以使用),然后将其添加到序列号中。

例如,节点1生成序列001-00001 001-00002 001-00003等,节点5生成005-00001 005-00002

独特 :-)

或者,如果你想要某种集中式系统,你可以考虑让你的序列服务器以块的形式给出。这显着降低了开销。例如,不是从中央服务器为每个必须分配的ID请求新ID,而是从中央服务器请求10,000个块中的ID,然后在用完时只需要执行另一个网络请求。

#3 热门回答(13 赞)

现在有更多的选择。

你这个问题是"老",我来到这里,所以我认为留下我所知道的选项(到目前为止)可能是有用的:

你可以试试Hazelcast。在它的1.9版本中,它包含了java.util.concurrent.AtomicLong的Distributed实现

你也可以使用Zookeeper。它提供了创建序列节点的方法(附加到znode名称,我更喜欢使用节点的版本号)。你要小心这一点:如果你不想在你的序列中错过数字,那可能不是你想要的。

干杯

java 分布式序列号_分布式序列号生成?相关推荐

  1. java生成唯一有序序列号_分布式唯一 ID 之 Snowflake 算法

    SegmentFault 社区专栏:全栈修仙之路作者:semlinker No.1 Snowflake 简介 1.1 什么是 Snowflake Snowflake is a service used ...

  2. java不规则算法_分布式id生成算法 snowflake 详解

    背景 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识.如在支付流水号.订单号等,随者业务数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数据库的自增ID显然不能满足需 ...

  3. Java jta 原理_分布式事务JTA实现Atomikos与Spring集成实践

    Atomikos官网无法访问,不过Maven中央库中具atomikos包.Atomikos集成Spring,Hibernate,Mybatis网上文章比较多,本文是通过JavaSE的方式借用Sprin ...

  4. java分布式定时_分布式定时任务程序

    分布式定时任务程序 介绍 基于zookeeper实现的分布式定时任务程序. 软件架构 包含: 1.zookeeper 2.quartz 3.curator 4.rabbitmq 5.springboo ...

  5. java 实现序列号_简易序列号实现

    1 packagecom.itch;2 importjava.text.SimpleDateFormat;3 importjava.util.Calendar;4 importjava.util.Da ...

  6. java jta_JTA规范_分布式事务教程_田守枝Java技术博客

    JTA规范事务模型 Java事务API(JTA:Java Transaction API)和它的同胞Java事务服务(JTS:Java Transaction Service),为J2EE平台提供了分 ...

  7. java分布式全文检索_分布式全文检索服务器——ElasticSearch(1)

    写在前面 Elaticsearch,简称为es,es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储.检索数据:本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据.es也使用Jav ...

  8. java文件存储系统_分布式小文件存储系统

    #分布式图片存储系统(demo版) ##服务端启动流程: 1.启动nameserver: 运行ndfs.nameserver.NameServerMainClass的main方法.相应的端口和参数配置 ...

  9. mysql 唯一序列号_利用mysql生成唯一序号

    在数据库分表或者程序自己需要唯一id的情况下,我们需要一个生成唯一id的方案. 可以编写一个综合时间和某些特征生成唯一id的程序,也可以考虑使用数据库里自增id的特性来实现这个需求,下面举个mysql ...

  10. ole db 访问接口 sqlncli 无法启动分布式事务_分布式锁真的安全吗?

    最近工作中遇到了一个非常棘手有趣的故障. 让我结结实实通了两宵,睡了一个周末才缓过来.不过这篇文章讲的并不是这个故障的原因, 而是修复故障所带来的衍生问题和思考. 在升级解决这些机器的过程中, 机器被 ...

最新文章

  1. android studio 发布项目的流程
  2. axure 8 表格合并_搞定LaTeX论文中的表格
  3. 网易前端进阶特训营,邀你免费入营!一举解决面试晋升难题!
  4. anaconda下安装新包一直报错(‘parse() got an unexpected keyword argument 'transport_encoding'’)...
  5. hadoop day 6
  6. logger异常日志要点总结
  7. 求1+2+…+n变态问题的两个很棒的解法
  8. Leecode刷题热题HOT100(12)——整数转罗马数字
  9. python和excel能结合应用吗_通过Python在Excel中使用机器学习
  10. nopcommerce插件深度剖析
  11. paip.操作符重载的缺失 Java 的一个大缺点
  12. “阿里云开放平台俱乐部”首站启航
  13. 学习c语言的编程游戏,扫雷游戏-C语言编程学习
  14. latex中输入matlab代码,Latex插入matlab代码
  15. 电子信息系统机房设计规范
  16. Ubiquitous Religions POJ - 2524
  17. 这 26个 Python 技巧,你肯定还不知道!
  18. 同洲电子转型之殇:新瓶装老酒的定位迷航
  19. qt编译quazip静态库_Qt之QuaZip编译-使用教程
  20. 基于STM32的倒车雷达系统设计

热门文章

  1. 打车软件系统分析与设计方案
  2. 如何实现台达触摸屏与台达PLC之间的远距离无线数据交换?
  3. 【axure手机原型】iOS应用设计要点总结
  4. Golang-PKCS8
  5. 科学家计算机模拟宇宙,科学家利用计算机模拟整个宇宙的演化
  6. 永磁同步电机矢量控制(二)——控制原理与坐标变换推导
  7. CT影像数据(nrrd文件和dicm文件)的读取和预处理
  8. 都有哪些查找和下载英文文献的方法?
  9. 药事管理学名词解释和问答题题集
  10. 案例解读|江苏银行—智多星大数据分析云平台实践