ID生成服务系列(二)

本文涉及的产品
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
注册配置 MSE Nacos/ZooKeeper,182元/月
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
简介: ID生成服务系列(二)

本地ID生成器,分布式ID生成器

本地ID生成器是指在本地环境中生成唯一标识符(ID)的工具或算法。本地ID生成器是相对于 分布式ID生成器而言的。二者的区分不是ID的用途,而是生产ID是否存在 网络 IO开销:

①、本地ID生成器在本地生产ID,没有网络IO开销;

②、分布式ID生成器 需要进行远程调用生产ID,有网络IO开销;

在设计ID生成器时,需要考虑以下几个方面

1. 唯一性:生成的ID必须在整个系统中是唯一的,以避免冲突。

2. 可排序性:生成的ID应该具有可排序性,以便根据ID的顺序进行查询和排序操作。

3. 性能:ID生成的过程应该高效,不应该成为系统的瓶颈。

4. 可读性:生成的ID可以是可读的,便于调试和理解。

5. 分布式支持:如果系统是分布式的,需要确保在多个节点上生成的ID是唯一的

常见的本地ID生成器算法包括:

1. 自增ID:使用一个计数器(本地计数器、或者分布式计数器),在每次生成ID时递增。这种方式 简单高效,但在分布式环境中需要额外的考虑,以避免冲突,长整型,64位,8个字节。

2. UUID(Universally Unique Identifier):使用标准的UUID算法生成唯一的128位标识符。UUID 可以使用时间戳、MAC地址等信息来保证唯一性,但不具备可排序性。 UUID.randomUUID().toString().repleace("-",");我们这样替换掉就可以了;32个字节。8-4-4-4-12的 36个字符,我一般短横线就减少了4个字节,从存储空间来说是long的是4倍。存储空间是自增Id的4倍。

3. 雪花算法(Snowflake):雪花算法是Twitter开源的一种分布式ID生成算法。它使用一个64位的 整数,结合时间戳、机器ID和序列号来生成唯一的ID。雪花算法具备可排序性和高性能,适用于 分布式环境。

分布式ID:数据库自增ID

这里常规是指数据库主键自增索引。特点如下:

(1)、架构简单容易实现。

(2)、ID有序递增,IO写入连续性好。

(3)、INT和BIGINT类型占用空间较小。

(4)、由于有序递增,易暴露业务量。

(5)、受到数据库性能限制,对高并发场景不友好。

(6)、bigint最大是2^64-1,但是数据库单表肯定放不了这么多,那么就涉及到分表。如果业务量真的太大了,主键的自增id涨到头了,会发生什么?报错:主键冲突。

分布式ID:Redis生成ID

(1)、通过redis的原子操作INCR和INCRBY获得id。

(2)、相比数据库自增ID,redis性能更好、更加灵活。

(3)、不过架构强依赖redis,redis在整个架构中会产生单点问题。

(4)、在流量较大的场景下,网络耗时也可能成为瓶颈。

分布式ID:ZooKeeper唯一ID

(1)、ZooKeeper是使用了Znode结构中的Zxid实现顺序增ID。

(2)、Zookeeper类似一个文件系统,每个节点都有唯一路径名(Znode),Zxid是个全局事务计数器,每个节点发生变化都会记录响应的版本(Zxid),这个版本号是全局唯一且顺序递增的。

(3)、这种架构还是出现了ZooKeeper的单点问题。

分布式雪花算法

虽然Snowflake 可以很容易扩展成为分布式架构

(1)、Snowflake + 机器固定编号

(2)、Snowflake +zookeeper 自增编号

(3)、Snowflake + 数据库 自增编号

相关文章
|
4月前
|
消息中间件 缓存 固态存储
说一说 Java 中的内存映射(mmap)
我是小假 期待与你的下一次相遇 ~
156 1
说一说 Java 中的内存映射(mmap)
|
存储 Kubernetes 算法
ID生成服务系列(一)
ID生成服务系列(一)
|
9月前
|
API 开发者
通义灵码 API 开发文档自动生成场景DEMO
通义灵码API开发文档自动生成场景DEMO展示了通过自定义指令,大模型能快速根据类代码生成Markdown格式的API文档。文档详细描述API的入参、出参,并可生成测试代码等示例,帮助开发者快速创建美观的API文档。
436 1
|
存储 算法 数据库
细数各大唯一id生成算法
一、序言几乎所有的业务系统,都有生成一个唯一id的需求,例如: 1.订单号2.活动id3.消息id这个记录标识往往就是数据库中的唯一主键,也可以作为唯一索引。这个记录标识上的查询,往往又有分页或者排序的业务需求,例如: (1)拉取最新的一页的聊天记录:select * by message_id/ order by gmt_create/ limit 100 (2)拉取最近的一百条流水:selec
698 0
细数各大唯一id生成算法
|
缓存 算法 安全
被追着问UUID和自增ID做主键哪个好,为什么?
讨论了UUID和自增ID作为数据库主键的优缺点。UUID全局唯一,适合分布式系统,但存储空间大,不适合范围查询。自增ID存储空间节省,查询效率高,但分库分表困难,可预测性高。UUID版本包括基于时间戳(V1)、随机数(V4)以及基于名称空间的MD5(V3)和SHA1(V5)散列。
被追着问UUID和自增ID做主键哪个好,为什么?
|
物联网 应用服务中间件 Linux
CentOS7.9 Nginx+EMQX集群组建MQTTS平台
通过以上步骤,您已成功搭建了一个基于CentOS 7.9、Nginx和EMQX的MQTTS平台。这个平台既能保证数据传输的安全性,又能利用Nginx的负载均衡能力和EMQX的高性能、高并发处理能力,实现稳定高效的消息服务。在部署和配置过程中,务必注意证书、域名以及EMQX配置的正确性,确保系统安全和稳定运行。此外,定期更新软件和系统,以及监控系统性能,也是保证MQTTS平台长期稳定运行的重要环节。
361 3
|
SQL 存储 数据处理
实时计算 Flink版产品使用合集之flink-connector-mysql-cdc 和 flink-sql-connector-mysql-cdc有什么区别
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
672 1
|
搜索推荐 Java 数据库
基于springboot+vue网上图书商城(程序+数据库+文档)
基于springboot+vue网上图书商城(程序+数据库+文档)
|
消息中间件 运维 Prometheus
小红书消息中间件的运维实践与治理之路
近年来,消息领域的全面云原生化逐渐走向深入,比如 RocketMQ 5.0 版本的存算分离设计和 raft 模式,再比如 Kafka3.0 引入了分层设计的方式(tiered storage)和 raft 模式,以及近年来新崛起的 Pulsar 也开始采用云原生架构,在未来都可以针对具体业务需求引入进行功能迭代,发挥组件的最大价值。
1158 105
小红书消息中间件的运维实践与治理之路
|
SQL 关系型数据库 MySQL
【MySQL】Mysql索引失效场景(15个必知)(一)
【MySQL】Mysql索引失效场景(15个必知)(一)
1548 0
【MySQL】Mysql索引失效场景(15个必知)(一)