对于分布式系统而言,意味着会有很多个instance会并发的生成很多业务数据,比如订单。不同的机房、不同的机器、不同的应用实例会同时生成。所以,如何生成一个好用的全局id并不是一个简单的uuid就能够搞定的事情。事实上,数据库内置的序列(oracle)或者自增机制(mysql)也无法满足需求。虽然可以设置gap,但是他无法做到扩展时基本不受影响。

同时,纯粹意义上的uuid(指的是逻辑上,而非技术上的uuid)或者整数自增在大型应用中,很有可能是不合适的,因为很多时候,我们真正需要的ID是有一定意义的,比如反应了业务类型,日期,甚至客户编号。当然纯粹意义上的业务无关的uuid也不是一无是处,比如说在图片分享应用中,id可能就确实不需要什么含义,在社交应用中,可能id也确实不需要意义。

但是,很多应用比如saas、大型分布式企业应用比如金融交易系统、电商交易系统,完全无意义的uuid很有可能使得成本增加很多。因为不同于社交应用,企业应用的业务模式通常是用户自己的数据相关的,而不是没有倾向性的。所以,在设计uuid的过程中,我们其实针对场景进行细化,整理了一下如下的草图:

电商类的,可能需要进一步细化是搜索的还是交易处理的、资金处理的。总的来说,就是整个平台内需要根据实际情况进行分类:

1、纯UUID的;

2、业务前缀+UUID;

3、业务前缀+用户+UUID;

对于saas的,可能还会出现

4:APPID+业务前缀+用户+UUID;

日期部分,看情况,可能有,也可以没有。

为了保证长度不超过32位,UUID我们采用的是snowflake的算法实现参考。

采用一刀切的方法,通常来说,这个架构师是经验欠缺的。

分布式系统下的全局id生成策略分析的更多相关文章

  1. 高并发环境下全局id生成策略

    解决方案: 基于Redis的全局id生成策略:(推荐此方法) 基于雪花算法的全局id生成: https://www.cnblogs.com/kobe-qi/p/8761690.html 基于zooke ...

  2. 图解Janusgraph系列-分布式id生成策略分析

    JanusGraph - 分布式id的生成策略 大家好,我是洋仔,JanusGraph图解系列文章,实时更新~ 本次更新时间:2020-9-1 文章为作者跟踪源码和查看官方文档整理,如有任何问题,请联 ...

  3. 分布式高并发下全局ID生成策略

    数据在分片时,典型的是分库分表,就有一个全局ID生成的问题.单纯的生成全局ID并不是什么难题,但是生成的ID通常要满足分片的一些要求:   1 不能有单点故障.   2 以时间为序,或者ID里包含时间 ...

  4. 架构设计 | 分布式业务系统中,全局ID生成策略

    本文源码:GitHub·点这里 || GitEE·点这里 一.全局ID简介 在实际的开发中,几乎所有的业务场景产生的数据,都需要一个唯一ID作为核心标识,用来流程化管理.比如常见的: 订单:order ...

  5. 可实现的全局唯一有序ID生成策略

    在博客园搜素全局唯一有序ID,罗列出来的文章大致讲述了以下几个问题,常见的生成全局唯一id的常见方法 :使用数据库自动增长序列实现 : 使用UUID实现:  使用redis实现: 使用Twitter的 ...

  6. 分布式全局唯一ID生成策略

    为什么分布式系统需要用到ID生成系统 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识.如在美团点评的金融.支付.餐饮.酒店.猫眼电影等产品的系统中,数据日渐增长,对数据库的分库分表后需要有 ...

  7. MySQL分库分表环境下全局ID生成方案 转

    在大型互联网应用中,随着用户数的增加,为了提高应用的性能,我们经常需要对数据库进行分库分表操作.在单表时代,我们可以完全依赖于数据库的自增ID来唯一标识一个用户或数据对象.但是当我们对数据库进行了分库 ...

  8. MySQL分库分表环境下全局ID生成方案

    在大型互联网应用中,随着用户数的增加,为了提高应用的性能,我们经常需要对数据库进行分库分表操作.在单表时代,我们可以完全依赖于数据库的自增ID来唯一标识一个用户或数据对象.但是当我们对数据库进行了分库 ...

  9. 【转】MySQL分库分表环境下全局ID生成方案

    转载一篇博客,里面有很多的知识和思想值得我们去思考. —————————————————————————————————————————————————————————————————————— 在大 ...

随机推荐

  1. centos 卸载已安装的软件

    以mysql举例: 首先查询安装包: rpm -qa|grep mysql 查询到的一个结果为:mysql-community-libs-5.7.13-1.el6.x86_64 yum 删除 yum ...

  2. linux sed 常见字符串处理

    1.删除特殊字符 将 1.1.0_boke_1.0.1 转换为110_boke_101 command: new_var=`echo 1.1.0_boke_1.0.1 |sed  s/\.//g` ( ...

  3. 石子合并(区间DP经典例题)

    题目链接:https://www.luogu.org/problemnew/show/P1880 #include <cstdio> #include <cmath> #inc ...

  4. MVC4 原版样式

  5. python mysql program

    //test.py #!/usr/bin/python # -*- coding: UTF-8 -*- import MySQLdb # 打开数据库连接 db = MySQLdb.connect(&q ...

  6. centos7 cpanm安装,及perl模块安装

    1. cpan安装 yum安装 yum install perl-App-cpanminus.noarch 注意:安装完成后,root及非root用户都可以使用cpanm安装模块,root用户直接用c ...

  7. iOS Xcode 用 GitHub 托管项目

    直接在xcode里用Github教程:http://jingyan.baidu.com/article/ab0b5630936ab6c15afa7d1c.html 经过本人尝试之后,发现,使用官网的客 ...

  8. 从零开始一起学习SLAM | 你好,点云

    本文提纲 先热热身点云是啥你知道点云优缺点吗?点云库PCL:开发者的福音PCL安装指北炒鸡简单的PCL实践留个作业再走先热热身 小白:hi,师兄,好久不见师兄:师妹好,上周单应矩阵作业做了吗?小白:嗯 ...

  9. Beta冲刺阶段3.0

    1. 提供当天站立式会议照片一张 2. 每个人的工作 (有work item 的ID) 成员 昨天已完成的工作 今天计划完成的工作 工作中遇到的困难 具体贡献 郑晓丽 完成"我的活动&quo ...

  10. Java基础(basis)-----异常与错误处理

    1.编译型异常和运行时异常       编译时异常是指程序正确 而由外界条件不满足而产生的异常 java 中要求必须去捕捉住这类异常 不然无法通过编译 运行时异常是指程序存在着bug 如空指针异常 数 ...