本地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 + 数据库 自增编号