36

【开源】分布式ID生成器 - 简书

 4 years ago
source link: https://www.jianshu.com/p/e987420a2b5b?
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
0.532020.06.08 09:33:24字数 1,073阅读 696

分布式ID生成器

伴随互联网的发展,无论分布式系统、还是存储都变得更复杂、数据量更大,这些都需要唯一的标识记录。简单举例,数据库单表时,通常使用数据库自带的自增ID就可以了,但分库分表后,数据库自带的自增ID就无法满足需求了,我们需要有一个算法或服务来生产分布式ID。

很多公司都会自研唯一ID生成服务,来满足唯一标识的问题。

ID-Generator

ID-Generator分布式ID生成器,解决在分布式系统唯一性标识生成复杂、不统一的问题,如数据库分库分表数据唯一标识、业务流水号、链路跟踪唯一标识等场景。提供一站式部署,稳定、高性能的ID生成系统。

webp
  • 提供全局唯一ID序号;
  • 提供隔离增长序号,以唯一KEY为自增ID标识,如数据库-表之间的自增id效果;
  • 支持自定义增长步长;
  • 支持固定前缀;
  • 支持固定位数;
  • 支持ID重置;
  • 支持Dubbo、Spring Cloud应用部署;
  • 支持MyBatis插件,可直接插入ID;
  • 支持try it,查看模拟ID效果;
  • 支持页面配置,即时生效;

设计与实现

  • 0成本接入,部署即可以使用;
  • 操作简单,页面配置,即时生效;
  • 功能丰富,不仅限于递增序列生成,同时支持各种流水号、前缀、日期、重置等功能;
  • 性能稳定,节点之间无状态,可以根据流量随时扩容;
  • 代码预留扩展,持续集成;

ID-Generator采用业内比较常用内存处理的方式,应用独立部署,提供生成ID能力的服务。服务启动时,先从存储中获得ID生成规则和取值范围,再经过计算生成ID值暂时存至内存。其它应用通过参数key调用ID服务,从内存获得ID值。服务定时检查内存剩余量,及时向内存补充ID值。

全局唯一ID生成算法基于Twitter开源的Snowflake算法。

  • 1bit-不用:符号位,0表示正数,1表示负数,ID都是正整数,所以为常数0不变;
  • 41bit-时间戳:精确到毫秒;
  • 10bit-工作机器id:通常需要依赖zookeeper等三方工具生成机器号,为减少其它依赖,此处使用本机mac地址计算方式,获得1-1024数值;
  • 12bit-序列号:流水号(每1毫秒,每1个节点,可以生产4096个ID,相当于409万TPS。);

因使用Snowflake算法依赖机器时间,需要注意机器时间回拨问题。

ID-Generator支持与Dubbo、Spring Cloud无缝集成,满足大部分公司技术栈,部署即可使用。id-generator-core核心使用springboot2.1.X最新稳定版;id-generator-simple模块提供HTTP协议接口,对多语言支持。

id-generator-metric监控模块,使用HTTP协议实现注册/发现功能,监控各ID服务节点,采集ID服务中KEY的内存剩余量,便于更合理的设置内存容量与阈值。

ID-Generator支持MySQL和Redis等多种数据存储方式,实现通过配置文件自动适配。配置方式:

---
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/idgenerator
    username: root
    password: root

#---
# 遵循SpringBoot规则,支持集群模式
#spring:
#  redis:
#    host: 127.0.0.1
#    port: 6379

扩展-MyBatis插件

为更易集成,代码更优雅,通过MyBatis插件,实现注解方式自动注入分布式唯一ID。例如:

//mybatis insert对象
public class DemoModel {
   
    /**
     * 注解实现自动注入,对应key=pay_id的ID值
     */
    @IdField("pay_id")
    private Integer test2;

}

更多...

  • client端的SDK模式,远程通信模块,不再依赖Dubbo、Spring Cloud框架;
  • server端golang版本;

Recommend

  • 62
    • www.jianshu.com 7 years ago
    • Cache

    实践基于Redis的分布式锁 - 简书

    本文来自社区这周的讨论话题—— 技术专题讨论第四期:漫谈分布式锁,也总结了我对分布式锁的认知和使用经验。 应用场景 当多个机器(多个进程)会对同一条数据进行修改时,并且要求这个修改是原子性的。这里有两个限定:(1)多个进程之间的竞争,意味着JDK自带的锁...

  • 52
    • www.jianshu.com 7 years ago
    • Cache

    分布式系统接口幂等性 - 简书

    1.幂等性定义 1.1 数学定义 在数学里,幂等有两种主要的定义: 在某二元运算下,幂等元素是指被自己重复运算(或对于函数是为复合)的结果等于它自己的元素。例如,乘法下唯一两个幂等实数为0和1。 即 s *s = s某一元运算为幂等的时,其作用在任一元素两次后会和其作...

  • 53
    • www.jianshu.com 7 years ago
    • Cache

    分布式租约机制 - 简书

    分布式租约机制 1.什么是租约 租约(lease)在分布式中一般描述如下: Lease 是由授权者授予的在一段时间内的承诺。 授权者一旦发出 lease,则无论接受方是否收到,也无论后续接收方处于何种状态,只要 lease 不过期,授权者一定遵守承诺,按承诺的时间、内容执行...

  • 41

  • 24
    • www.tuicool.com 5 years ago
    • Cache

    分布式 id 生成器

    公众号后台回复“ 学习 ”,获取作者独家秘制精品资料 扫描下方海报二维码,试听课程:

  • 14

    首选,不管是不是分布式系统,都有 ID 唯一的使用场景。而在分布式场景下,对 ID 的唯一性要求更严格! 常见的,我们上淘宝买东西的订单 ID,就是一种分布式 ID。淘宝,前期的订单 id 好像是 14 位,现在好像已经是 16 位,或者...

  • 16
    • studygolang.com 4 years ago
    • Cache

    分布式ID生成器

    背景 伴随互联网的发展,无论分布式系统、还是存储都变得更复杂、数据量更大,这些都需要唯一的标识记录。简单举例,数据库单表时,通常使用数据库自带的自增ID就可以了,但分库分表后,数据库自带的自增ID就无法满足需求了,...

  • 8

    在上一篇文章《高性能分布式ID生成器实现方法总结》...

  • 12
    • jasonkayzk.github.io 3 years ago
    • Cache

    高性能分布式ID生成器实现方法总结

    在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识。如在支付、餐饮、酒店等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数据库的自增ID显然不能满足需求;特别一点的如订单、骑手、优惠券也都需要有唯一ID...

  • 10

    Win10/11历险记 2015.8 我大概在4、5月间,听说了Win10免费升级的消息。于是一直很期待7月29日的到来。果然到了29日当天下午的时候,公司电脑就收到了升级的通知。然而由于网速不给力,当天并未对公司电脑进行升级。倒是晚上在家里的电脑上,...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK