Java秒杀系统实战系列~分布式唯一ID生成订单编号
发布时间:2025-05-24 07:08:07 发布人:远客网络
一、Java秒杀系统实战系列~分布式唯一ID生成订单编号
1、在本篇“Java秒杀系统实战系列文章”的第七篇中,我们将关注如何在高并发场景下生成全局唯一、趋势递增的订单编号。本文将介绍两种方法:基于随机数生成和采用分布式唯一ID生成算法-雪花算法。
2、在上一篇博文中,我们实现了秒杀业务逻辑,其中包括为秒杀成功的用户生成订单记录。关键点在于高效生成订单编号,以满足以下两个要求:快速稳定地生成,减少延迟;确保编号全局唯一、不重复、趋势递增、有序。
3、首先,我们将采用基于随机数的方式生成订单编号。通过构建Thread类,每个线程在run方法中生成订单编号,并插入数据库表中。使用ThreadLocalRandom实现随机数生成逻辑。接着,开发一个BaseController控制器的请求方法,模拟高并发环境下的多线程生成订单编号。然而,在执行此方法时,我们发现存在重复生成的订单编号问题,同时生成的记录数量少于实际线程数量。这种基于随机数生成唯一ID的方式在高并发场景下并不满足需求。
4、为解决此问题,我们将介绍另一种流行且典型的分布式唯一ID生成算法-雪花算法。此算法底层实现基于位运算,通过直接与机器打交道高效生成全局唯一ID。雪花算法的底层数据存储结构为64位,分为时间戳、机器ID和序列号三部分。接下来,我们将基于雪花算法生成秒杀系统所需的订单编号。
5、首先定义一个Thread类,实现逻辑为使用雪花算法生成订单编号并插入数据库。SNOW_FLAKE.nextId()方法用于生成全局唯一的订单编号。接下来,在BaseController中开发请求方法,模拟高并发环境下多线程抢单场景。通过Postman发起请求观察控制台输出及数据库表记录,发现1000个线程成功生成1000个订单编号,无重复情况。这种基于雪花算法的方法在高并发场景下满足需求。
6、通过本篇内容,我们了解了如何在高并发环境下生成全局唯一、趋势递增的订单编号,并对比了基于随机数生成与雪花算法两种方法的优劣。在实际应用中,推荐采用分布式唯一ID生成算法-雪花算法以确保高效、稳定地生成订单编号。
二、分布式ID生成器
在分布式系统中,往往需要对大量的数据和消息进行唯一标识,此时一个能够生成全局唯一ID的系统是非常必要的,那么业务系统对ID号的要求有哪些呢?
UUID(Universally Unique Identifier)的标准型式包含32个16进制数字,以连字号分为五段,形式为8-4-4-4-12的36个字符,示例:5e8c4456-6166-40d6-9b9f-fb37a150bc6e,到目前为止业界一共有5种方式生成UUI,Java标准类库中已经提供了UUID的API。
雪花ID生成的是一个64位的二进制正整数,然后转换成10进制的数。64位二进制数由如下部分组成:
41-bit的时间可以表示(1L<<41)/(1000L*3600*24*365)=69年的时间,10-bit机器可以分别表示1024台机器。如果我们对IDC划分有需求,还可以将10-bit分5-bit给IDC,分5-bit给工作机器。这样就可以表示32个IDC,每个IDC下可以有32台机器,可以根据自身需求定义。12个自增序列号可以表示2^12个ID,理论上snowflake方案的QPS约为409.6w/s,这种分配方式可以保证在任何一个IDC的任何一台机器在任意毫秒内生成的ID都是不同的。
但是对于绝大部分普通应用程序来说,根本不需要每秒超过400万的ID,机器数量也达不到1024台,所以,我们可以改进一下,使用更短的ID生成方式:53bitID由32bit秒级时间戳+16bit自增+5bit机器标识组成,累积32台机器,每秒可以生成6.5万个序列号。
最后,为什么采用最多53位整型,而不是64位整型?这是因为考虑到大部分应用程序是Web应用,如果要和JavaScript打交道,由于JavaScript支持的最大整型就是53位,超过这个位数,JavaScript将丢失精度。因此,使用53位整数可以直接由JavaScript读取,而超过53位时,就必须转换成字符串才能保证JavaScript处理正确,这会给API接口带来额外的复杂度。
参考资料:
三、怎么让浏览器支持java
1、按照以下说明通过您的 Web浏览器启用 Java
2、单击工具,然后单击 Internet选项
3、选择安全选项卡,选择自定义级别按钮
4、Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。
5、Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。