提示:文章先作为初版,等后续时间充足后,补充更深的内容
分布式ID
一、定义
分布式ID(Distributed ID)是在分布式系统中生成唯一标识符的一种技术。由于分布式系统中存在多个节点并行处理请求,为了避免不同节点生成相同的标识符,需要引入分布式ID来保证唯一性。
二、常见的分布式ID解决方案
UUID(Universally Unique Identifier):UUID是一种128位的标识符,通常以字符串形式表示。UUID的生成算法基于MAC地址、时间戳和随机数等信息,保证了在理论上的唯一性,但由于其长度较长,不适合作为数据库索引或URL参数。【复杂度最低,但是影响存储空间和性能】
基于数据库的自增ID:通过数据库的自增主键生成唯一ID。每个节点向数据库请求ID时,通过自增操作获取唯一ID。【高并发场景下,可能会造成数据库的瓶颈和性能问题】。
雪花算法(Snowflake):雪花算法是Twitter开源的一种分布式ID生成算法。它由一个64位的整数组成,其中包含了时间戳、机器ID和序列号等信息。雪花算法可以在分布式环境中生成有序且唯一的ID,适用于高并发的场景。
数据库范围ID生成:每个节点维护一个独立的ID生成器,从数据库中获取一段连续的ID范围,然后在节点内部使用这个范围生成唯一ID。节点之间不会产生冲突,但需要依赖于数据库的分配机制和同步策略。
Redis等缓存中间件生成:利用Redis等缓存中间件的原子性操作和自增特性(zookeeper的顺序节点),生成唯一ID。每个节点通过自增操作获取唯一ID,不同节点之间可以并行生成,避免了数据库的瓶颈。
这些解决方案各有优缺点,选择合适的分布式ID方案取决于具体的应用场景和需求。需要考虑唯一性、性能、并发性、可扩展性和部署复杂度等因素。
三、雪花算法
雪花算法(Snowflake)是一种分布式ID生成算法,其底层实现相对简单。它由以下三部分组成,共64位:
时间戳:使用41位来表示时间戳,精确到毫秒级。可以根据具体需求进行调整,比如使用更高的位数来表示更精确的时间戳或者扩展时间戳的范围。
机器ID:使用10位来表示机器ID,可以区分1024台不同的机器。在分布式环境中,不同的机器需要具有唯一的标识符,可以通过配置文件或其他方式指定每台机器的机器ID。
序列号:使用12位来表示序列号,可以在同一毫秒内生成4096个不同的ID。如果在同一毫秒内生成的ID数量超过4096个,序列号将从0开始重新计数,直到下一毫秒。
外加一位符号位
雪花算法生成唯一ID的过程如下:
获取当前时间戳,精确到毫秒级。
判断当前时间戳是否与上次生成ID的时间戳相同,如果不同,则将序列号重置为0。
如果当前时间戳与上次生成ID的时间戳相同,则递增序列号。
将时间戳、机器ID和序列号组合在一起,生成最终的唯一ID。
由于每个部分的位数不同,它们在最终的唯一ID中的位置是固定的,因此可以保证生成的ID具有全局唯一性。Snowflake算法通过时间戳和机器ID的组合,以及序列号的递增来生成有序且唯一的ID,适用于高并发的分布式系统。