分布式ID方案的要求
分布式 ID 生成方案首先要满足ID的唯一性。
在此基础上再优化,从而为业务提供更好的支持。如:
ID有意义
如果ID是有序的,或其本身就包含了相关业务的时间等其它应用系统本身的业务信息,那就有利于提高处理业务的效率。
提高数据查找效率就是最常见的好处。
服务高可用
生成ID的机器(服务)应该是高可用的,以满足分布式系统整体的高可用目标。
这可以通过主从备份或真正的分布式多服务实例来实现。
ID紧凑
过长的ID处理起来比较耗费资源。在数据库存储与索引性能方面,长ID都不如短ID表现得好。
设计ID时也需要考虑编程语言中基本数据类型是否可以方便地表示ID。
此外,如果某些场景中生成ID的需求非常密集,那么还得考虑单位时间内所能生成ID的上限是否足以支撑业务。
两种分布式ID方案
一般有两种方案:
方案一:基于数据库自增序列
优点:简单易用
缺点:
每生成一个ID都会触发一次数据库写请求,代价较高;
构建高扩展性和可靠性的解决方案比较复杂。因为会涉及数据库本身的扩展性和可靠性方案。
方案二:基于 Snowflake 的方案
优点:算法简单,对外部依赖少,性能好
缺点:存在时钟偏斜问题。计算机可能发生时钟回拨问题,导致时间戳不准确,继而产生重复ID。
可以通过设置操作系统 ntp 的 stepback 为0,以禁止时钟回调。
也可以缓存历史时间戳,用于在生成新ID时检查新的时间戳是否晚于前一个时间戳。
如果晚于前一个时间戳在,则可以等待时钟或直接提示服务不可用,以避免重复ID。
Redis、Zookeeper、MongoDB 等系统中都有 Snowflake 的变种。
如,MongoDB 中每个 document 唯一的 ObjectId。
Snowflake 方案简介
Snowflake ID 的唯一性
Snowflake ID 的唯一性分为两部分:
不同机器所生成 ID 之间的唯一性
这是通过为每台ID生成机设定标号,并将编号信息结合到最终的ID中来实现的。
即,可以通过 Snowflake ID 的值反推出它是哪台机器生成的。
同一台机器所生成 ID 之间的唯一性
Snowflake 将生成 ID 时的时间也结合到了 ID 中。其粒度为毫秒。
在同一毫秒内生成的ID则是通过一段序号来区分的。在同一毫秒内,该序号单调递增。
对于同一台机器(节点)生成的ID,它们之间有较好的有序性。
但是对于不同机器生成的ID,其有序性就没有保障。
Snowflake ID 结构
Snowflake 生成的 ID 大小为 64比特位。Java 中可用 long 类型来表示。
ID 由 4 部分组成:
标识位
占 1 个比特位。固定值为 0,意味着ID是正数。
时间戳
占 41 个比特位。这意味着该ID方案最多可用时间为 2的41次方 秒,不到70年。
通常用 System.currentTimeMillis() 方法获得该值。
即,从“1970-01-01 00:00:00.000 UTC” 到当前系统时间的毫秒数。
System.currentTimeMillis() 方法返回的时间戳是 long 类型的;
取该时间戳的低 41 位作为 Snowflake 的时间戳部分。
Worker ID
占 10 个比特位。表示该 Snowflake ID 是哪台机器生成的。
其中,5个比特位表示机器所在的数据中心,另5个比特位表该机器在此数据中心内的编号。
这意味着该ID方案最多支持32个数据中心(2的5次方),每个数据中心内最多32台ID生成器(2的5次方)
ID 序列
占 12 个比特位。这意味着,在单位毫秒内,单个节点最多只能生成 4096个ID(2的12次方)。
在实际工程中,可以根据业务场景对ID的各部分所占空间进行调整,甚至加入其它业务信息。
如,增大ID序列所占空间,可以支持单位毫秒内生成更多ID。
相关推荐
Snowflake算法是由Twitter开源的一种高效且可扩展的分布式ID生成方案,广泛应用于Java和其他编程语言的系统中。 Snowflake算法的核心思想是将64位的整数划分为不同的部分,分别为: 1. **时间戳**(41位):自定义...
综上所述,Twitter的雪花算法(Snowflake)提供了一种高效、简单的分布式ID生成方案,通过合理的结构设计,确保了全局唯一性和顺序性。在Java环境下,可以通过实现相应的类和方法轻松地引入这一机制,为分布式系统的...
分布式ID是现代大规模分布式系统中不可或缺的一个组成部分,它主要用于为分布式环境中的每个实体生成全局唯一且具有特定属性的标识符。以下将详细讲解分布式ID的相关知识点: 1. **UUID(Universally Unique ...
### 分布式ID生成方法详解 #### 一、引言 在分布式系统中,全局唯一标识符(Global Unique Identifier, GUID)的生成是一项基础而重要的技术。这些标识符被广泛应用于消息传递、订单处理和帖子识别等场景。本文将...
在Java开发中,生成分布式唯一ID是常见的需求,特别是在大数据量和高并发的场景下,保证每个记录的ID独特性至关重要。雪花ID(Snowflake ID)是一种被广泛采用的解决方案,由Twitter开源,其设计目标就是生成全局...
迄今为止最全面的分布式主键ID生成器。 优化的雪花算法(SnowFlake)——雪花漂移算法,在缩短ID长度的同时,具备极高瞬时并发处理能力(50W/0.1s)。 原生支持 C#/Java/Go/Rust/C/SQL 等多语言,且提供 PHP 扩展及 ...
Vesta,uidgennator等分布式id生成方案 UidGenerator是Java实现的, 基于Snowflake算法的唯一ID生成器。UidGenerator以组件形式工作在应用项目中, 支持自定义workerId位数和初始化策略, 从而适用于docker等虚拟化环境...
结合上述信息,"idGenerate"这个文件很可能是包含了一个Java实现的分布式代码生成器项目,可能包含了Snowflake算法或者其他分布式ID生成策略的源代码。通过学习和理解这些代码,我们可以更好地掌握在Java环境中如何...
分布式ID组件是分布式系统中一个非常重要的组件,Leaf-snowflake模式和Leaf-segment模式是两种常用的分布式ID生成方式。它们具有全局唯一性、信息安全性和数据递增性等特点,广泛应用于微服务下的业务编号生成和特殊...
Snowflake算法就是一种被广泛使用的分布式ID生成方案,它由Twitter开源,具有时间戳、工作机器ID和序列号三部分组成,能够确保在分布式环境下生成的ID具有唯一性、有序性和高性能。 Snowflake算法的核心思想是将64...
### 分布式ID生成方法详解 #### 一、需求背景及重要性 在现代软件开发过程中,无论是消息系统、订单管理、论坛应用等场景,都离不开一个关键元素——记录标识,比如`message-id`、`order-id`或`tiezi-id`等。这些...
We have retired the initial release of Snowflake and working on open sourcing the next version based on Twitter-server, in a form that can run anywhere without requiring Twitter's own infrastructure ...
《深入理解百度开源的分布式ID生成器UidGenerator》 在分布式系统中,生成全局唯一ID是一个常见的需求,而百度开源的UidGenerator就是这样一款强大的工具。它基于Snowflake模型,为系统提供了高性能且具有唯一性的...
美团的双buffer分布式ID生成系统基于Twitter的Snowflake算法进行改良,核心思想是将ID分为多个部分,如时间戳、工作机器ID和序列号。双buffer的设计主要是为了提高系统的稳定性和可用性,具体如下: 1. **时间戳**...
Twitter开源的Snowflake算法是一种常用的分布式ID生成策略,它将ID分为三部分:时间戳(41位)、工作机器ID(10位)和序列号(12位)。通过这种方式,可以保证ID的全局唯一性,并且有序。 #### 3.2 UUID UUID...
分布式ID生成是现代互联网系统中不可或缺的一个环节,它在各种业务场景中起到标识唯一对象的作用。为了满足分布式环境的需求,生成的ID需要具备以下几个关键特性: 1. 唯一性:确保每个ID在全球范围内都是独一无二...
Twitter Snowflake算法,php版代码; 请见博客: http://blog.csdn.net/envon123/article/details/52953872
分布式ID生成器是现代互联网系统中的重要组成部分,它在大数据量和高并发的场景下扮演着关键角色。本文将深入探讨“通用、灵活、高性能”的分布式ID生成器的设计原理、实现方式以及它在服务器应用和分布式服务/框架...
【Java实现Twitter的分布式自增ID算法snowflake】 在分布式系统设计中,生成全局唯一ID是一个常见的需求。Twitter的Snowflake算法就是为了解决这个问题而诞生的,它提供了一种高效、有序且不会冲突的ID生成策略。...