iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >交互分布式系统下如何生成唯一序列
  • 398
分享到

交互分布式系统下如何生成唯一序列

2024-04-02 19:04:59 398人浏览 八月长安
摘要

目录1 介绍2 数据库自增3 系统时间毫秒数4 UUID(GUID)5 批量预生成ID6 Redis生成唯一序列7 snowflake算法8 UidGenerator9 Leaf10

1 介绍

在常见的业务场景中,比如全局订单Id,唯一标识的支付编号等,都需要这个来保证。

那生成ID都有哪些解决方案呢?特别是在复杂的分布式系统业务场景中,我们应该采用哪种解决方案来实现这个唯一序列呢?

一般来说,这个唯一序号有如下几种特征:

  • 全局唯一性:确保生成的序列是全局唯一的,不可重复。

  • 有序性:确保生成的ID值对于某个用户或者业务是按一定的数字有序递增的。

  • 高可用性:确保生成ID功能的高可用,能够承接较大峰值,能够保证序列生成的有效性(不重复且有序)。

  • 带时间标记:ID中有时间片段组成,可是清晰识别出操作的时间。

下面是业内几种常见的分布式唯一序列生成方案,我们一一来介绍下。

2 数据库自增

数据库主键设置自增序号 auto_increment,可以按照一定的趋势自增,保证主键ID的唯一性。

这个方案简单易操作,优点是明显、可控。

但由于它是在数据库的单表上进行操作,对数据库性能依赖比较明显,高并发下的压力也很大。所以不是唯一ID生成的最佳方法。

1 create table `t_generator_id` 
2 ( 
3 `id` bigint(20) not null auto_increment,  -- 表示自增列 
4  -- 其他字段信息
5 )

3 系统时间毫秒数

我们可以使用当前系统时间精确到毫秒数(或者时间戳)+业务属性+用户属性+随机数+...等参数组合形式来确保ID的唯一性,缺点是ID的有序性难以保证,如果对有序性由强需求的业务不建议使用。

类似京东淘宝等电商的订单号生成。因为订单号和用户id在业务上的区别,订单号尽可能要多些冗余的业务信息,比如

滴滴:时间+起点编号+车牌号 ; 淘宝订单:时间戳+用户ID,类似滴滴订单的唯一序号如下:

4 UUID(GUID)

Java自带的生成UUID的方式(.net体系下也有GUID可以对应),生成的是Length=32的16进制格式的字符串,如果回退为byte数组共16个byte元素,即UUID是一个128bit长的数字,一般用16进制表示。

可以保证唯一性,但缺点是它不包含时间标识、业务数据可读性太差了,而且也不能ID的有序递增。优点生成方式,简单,高效,一般业务系统中比较少用。

5 批量预生成ID

1、在内存(缓存)中,按需批量生成N个ID,并将最大ID值记录到数据库中。比如生成 1~10000,把max=10000持久化到数据库中,内存中记录的是current=1和max=10000。

2、所有的使用都在内存中进行,每消耗一次序号,current + 1。

3、当current==max的时候,重复第一个步骤,再次批量生成 10001~20000的值,并将数据库中的max改成20000。

优点是避免了每次生成ID都要访问数据库并带来压力。

缺点是只能是单点服务,如果服务重启势必会造成ID丢失不连续的情况,而且这种方式也不利于水平扩展。

6 Redis生成唯一序列

Redis可以使用简易的String类型,它的 incr/decr key 语法,支持高效快速的增减值,能够保证生成的ID肯定是唯一有序的。

这种方式不依赖数据库持久化,速度快,算是比较好的办法了。但系统中引入Redis这一中间件,无形中增加维护成本。在超大流量、超高并发的情况下,单实例Redis还是无法满足的,需要横向扩展Redis集群来进行支撑。

1 <strong>incr</strong>/<strong>decr key</strong> // 自增减 1
2 <strong>incrby</strong>/<strong>decrby key</strong> increment  // 自增减指定数值
3 <strong>incrbyfloat</strong>/<strong>decrbyfloat key</strong> increment  // 自增减浮点数

还可以利用像ZooKeeper中的znode数据版本来生成序列号,及mongoDB的ObjectId等,但是性能不如Redis,不是很推荐。

7 snowflake算法

Twitter在把存储系统从Mysql迁移到Cassandra的过程中由于Cassandra没有顺序ID生成机制,于是自己开发了一套全局唯一ID生成服务:Snowflake。

如上图的所示,Twitter的snowflake算法下面几部分组成:

  • 41位的时间序列,精确到毫秒,可以使用69年

  • 10位的机器标识,最多支持部署1024个节点

  • 12位的序列号,支持每个节点每毫秒产生4096个ID序号,最高位是符号位始终为0。

这种方案性能好,在单机上是递增的,但是由于涉及到分布式环境,每台机器上的时钟不可能完全同步,也许有时候也会出现不是全局递增的情况。

而且这个项目在2010就停止维护了,但这个设计思路被很多厂家参考,应用于各个业务的ID生成器及变种。

8 UidGenerator

UidGenerator是百度开源的一款分布式高性能的唯一ID生成器,使用Java实现的, 基于Snowflake算法的唯一ID生成器。

在实现上, UidGenerator通过借用未来时间来解决sequence天然存在的并发限制; 采用RingBuffer来缓存已生成的UID, 并行化UID的生产和消费, 同时对CacheLine补齐,避免了由RingBuffer带来的硬件级「伪共享」问题. 最终单机QPS可达600万。

具体的GitHub地址如下:

https://github.com/baidu/uid-generator/blob/master/README.zh_cn.md

9 Leaf

Leaf是美团开源的分布式ID生成器,能保证全局唯一性、趋势递增、单调递增、信息安全,同时也需要依赖关系数据库、Zookeeper等中间件。

美团技术社区有详细的说明,同时也对分布式ID生成有一些比较好的分析和建议:Https://www.jb51.net/article/235968.htm

10 总结

个人觉得最好的是Redis方案和snowflake算法,无论是性能还是可用性程度上。另外各大厂也有自己的一些做法,比如百度的UidGenerator 和 美团的Leaf,

主要也是根据现有的方案进行优化和改造,达到比较契合他们自己业务的目标。

以上就是交互分布式系统下如何生成唯一序列的详细内容,更多关于交互分布式系统下的唯一序列的资料请关注编程网其它相关文章!

--结束END--

本文标题: 交互分布式系统下如何生成唯一序列

本文链接: https://www.lsjlt.com/news/163839.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 交互分布式系统下如何生成唯一序列
    目录1 介绍2 数据库自增3 系统时间毫秒数4 UUID(GUID)5 批量预生成ID6 Redis生成唯一序列7 snowflake算法8 UidGenerator9 Leaf10...
    99+
    2024-04-02
  • Go开源项目分布式唯一ID生成系统
    目录前言项目背景项目使用HTTP 方式gRPC 方式本地开发项目架构前言 今天跟大家介绍一个开源项目:id-maker,主要功能是用来在分布式环境下生成唯一 ID。上周停更了一周,也...
    99+
    2024-04-02
  • Redis生成分布式系统全局唯一ID的实现
    目录分布式系统全局唯一ID基于Redis INCR 命令生成分布式全局唯一ID采用Redis生成商品全局唯一ID分布式系统全局唯一ID 在互联网系统中,并发越大的系统,数据就越大,数...
    99+
    2024-04-02
  • 如何通过php接口和ECharts生成交互式统计图
    如何通过 PHP 接口和 ECharts 生成交互式统计图引言:在数据可视化中,统计图表是一种非常有效的方式来展示数据。ECharts 是一款功能强大的开源 JavaScript 图表库,它支持多种图表类型和丰富的交互功能。本文将介绍如何通...
    99+
    2023-12-18
    echarts PHP接口 统计图
  • 二维码在分布式系统中的应用,Python如何实现分布式计算和数据交互?
    随着互联网技术的发展,分布式系统已经成为了现代计算机系统的重要组成部分。在分布式系统中,多个计算机节点通过网络连接,共同完成一项任务。在这个过程中,数据交互和计算协作是必不可少的环节。而二维码正是一种非常便捷的数据交互方式,也可以在分布式...
    99+
    2023-10-02
    关键字 二维码 分布式
  • 如何理解分布式系统下基于Redis的分布式锁
    这篇文章主要介绍“如何理解分布式系统下基于Redis的分布式锁”,在日常操作中,相信很多人在如何理解分布式系统下基于Redis的分布式锁问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大...
    99+
    2024-04-02
  • java web在高并发和分布式下实现订单号生成唯一的解决方案
    方案一:如果没有并发,订单号只在一个线程内产生,那么由于程序是顺序执行的,不同订单的生成时间戳正常不同,因此用时间戳+随机数(或自增数)就可以区分各个订单。如果存在并发,且订单号是由一个进程中的多个线程产生的,那么只要把线程ID添加到序列号...
    99+
    2023-05-30
    java web 高并发
  • Django如何与Java分布式系统无缝集成?
    Django和Java分别是Python和Java语言中最流行的Web框架和分布式系统。然而,很多开发者在使用这两个框架时都会遇到一些问题。尤其是在需要将两个框架无缝集成的时候,这些问题会变得更加突出。本文将介绍如何将Django和Java...
    99+
    2023-09-18
    分布式 django numpy
  • Linux下如何部署分布式消息系统Kafka
    今天小编给大家分享一下Linux下如何部署分布式消息系统Kafka的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Kafka是...
    99+
    2023-06-27
  • 如何进行下一代分布式消息队列Apache Pulsar的分析
    如何进行下一代分布式消息队列Apache Pulsar的分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Pulsar简介Apache Pulsar是一个企业级...
    99+
    2023-06-02
  • Linux系统下如何生成引导盘与驱动程序盘
    这篇文章主要介绍“Linux系统下如何生成引导盘与驱动程序盘”,在日常操作中,相信很多人在Linux系统下如何生成引导盘与驱动程序盘问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux系统下如何生成引导盘...
    99+
    2023-06-10
  • PHP 分布式系统下如何实现高并发缓存?
    随着互联网的发展,高并发的问题变得越来越普遍。而缓存作为一种提高系统性能的解决方案,更是被广泛应用。在分布式系统中,如何实现高并发缓存,也成为了一个热门话题。本文将介绍在 PHP 分布式系统中如何实现高并发缓存,并附上相应的演示代码。 一...
    99+
    2023-09-22
    分布式 并发 缓存
  • 分布式系统下如何优化NumPy的计算性能?
    随着大数据时代的到来,NumPy已成为数据分析和科学计算领域不可或缺的工具。然而,当数据集过于庞大时,NumPy的计算性能就会受到限制。为了解决这个问题,我们可以利用分布式系统来优化NumPy的计算性能。 一、分布式系统简介 分布式系统是指...
    99+
    2023-09-24
    numpy 分布式 unix
  • JavaScript如何成为分布式系统开发的必备技能?
    随着云计算和分布式系统的普及,JavaScript 已经成为了分布式系统开发中必不可少的技能之一。本文将介绍 JavaScript 在分布式系统开发中的重要性和应用,并给出一些演示代码。 一、JavaScript 在分布式系统中的重要性 分...
    99+
    2023-09-21
    bash 分布式 javascript
  • 分布式系统中如何利用Python实现高效的二维码生成和扫描?
    随着移动互联网的快速发展,二维码已经成为了一种非常重要的信息传递方式。在很多场景中,我们需要使用二维码来实现不同设备之间的信息交换,比如支付、扫码登录等。在分布式系统中,如何实现高效的二维码生成和扫描是一个非常有意义的问题。 Python...
    99+
    2023-10-02
    关键字 二维码 分布式
  • 如何优化 PHP 应用程序中的路径加载和分布式系统集成?
    PHP 是一种流行的 Web 开发语言,它具有易于学习、灵活性高等优点。但是在处理大型应用程序时,路径加载和分布式系统集成可能会成为瓶颈。在本文中,我们将探讨如何优化 PHP 应用程序中的路径加载和分布式系统集成。 优化路径加载 路径加载是...
    99+
    2023-06-27
    path load 分布式
  • 二维码在分布式系统中的应用,Python如何实现快速生成和解码?
    随着现代科技的不断发展,分布式系统越来越受到人们的关注,而二维码作为一种快速便捷的信息传递方式,在分布式系统中也扮演着越来越重要的角色。本文将介绍二维码在分布式系统中的应用,并且详细介绍Python如何实现快速生成和解码二维码。 一、二维...
    99+
    2023-10-02
    关键字 二维码 分布式
  • 如何在分布式系统中保证缓存的一致性?
    随着分布式系统的不断发展,缓存的使用越来越普遍。但是,缓存的一致性问题也越来越受到关注。在分布式系统中,缓存的一致性是非常关键的一个问题,因为缓存的一致性直接影响到系统的性能和可靠性。本文将介绍如何在分布式系统中保证缓存的一致性。 一、缓存...
    99+
    2023-10-05
    缓存 分布式 编程算法
  • 如何解决生产环境分布式文件系统崩了问题
    这篇文章主要讲解了“如何解决生产环境分布式文件系统崩了问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何解决生产环境分布式文件系统崩了问题”吧!问题定位...
    99+
    2024-04-02
  • 如何在 Windows 上部署 Python 分布式系统并集成 JavaScript 应用?
    在当今互联网时代,分布式系统已成为不可或缺的基础设施之一,而 Python 和 JavaScript 作为两种最受欢迎的编程语言之一,也成为了分布式系统开发的主流语言。在本文中,我们将介绍如何在 Windows 上部署 Python 分布...
    99+
    2023-08-21
    分布式 javascript windows
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作