生成全局唯一ID的3个思路,来自一个资深架构师的总结

本文探讨了在分布式环境下如何保证标识的唯一性,通过类比生活中的命名空间来阐述标识的重要性和实现方式。文章介绍了基于数据库生成、分布式集群协调器生成和划分命名空间并行生成三种思路,并详细分析了各种方法的优缺点,如Twitter的Snowflake算法、MongoDB的ObjectId等。此外,还讨论了UUID、Hash算法以及文本兼容性和安全性等问题。
摘要由CSDN通过智能技术生成

标识(ID / Identifier)是无处不在的,生成标识的主体是人,那么它就是一个命名过程,如果是计算机,那么它就是一个生成过程。如何保证分布式系统下,并行生成标识的唯一与标识的命名空间有着密不可分的关系。在世界里,「潜意识下的命名空间里,相对的唯一标识」是普遍存在的,例如:

1.每个人出生的时候,就获得了一个「相对的唯一标识」——姓名。

2.城市的道路,都基本上采用了唯一的命名(当然这也需要一个过程 )。

显然,对于每个标识,都需要有一个命名空间(namespace),来保证其相对唯一性。

可以说,在人的意识里,对于的实体的描述是基于名字进行的,人们并不希望同名的出现太多,这会在沟通过程中的产生理解困难。

对于人来说,在家庭里会有小名,在社会中会有正式名字,在社交过程中还会产生绰号。

在中国,对于企业来说,除了企业有名称之外,还有组织机构代码证、有税务登记证、有工商营业执照,并分别对应三个编号。(当然,目前五证合一也在进行中)。

回到计算机领域,围绕主机在网络上的地址,在不同的命名空间中,都会存在一个「相对的唯一标识」用来描述一个实体:

每个以太网网卡,都有一个48-bit 的MAC地址

每个MAC地址,可能有一个或者多个IP地址

每个网卡,都可能有一个或者多个IP地址

每个IP地址,都可能有多个域名

当然,每个主机,都会有一个主机名

接续上面的例子,事实上,MAC地址是由 IEEE Standards Association Registration Authority 完成地址段的分配。

对于目前的 1530 个顶级根域(gTLD),以及 IPv4 / IPv6 地址,都由IANA对其进行管理。

上面我通过类比的方式简单介绍了标识,总结来说它是无处不在的。我们在理解技术里的ID的同时,一定要联系生活中的场景,对比着琢磨和分析。

标识是从一个典型的场景,对客观事物进行统一编码的过程。

采用半集中与半自主相结合 的方法,是一种实现「分而治之」十分普遍和有效的设计模式。

标识的唯一性是根据命名空间紧密相关的。

标识的使用

* 在不同命名空间中实现标识的转换*

在中国,对于人名,通常是由公安局出入境管理局完成中文至英文的翻译,同时,他们会把翻译结果写到数据库中,印到护照上。这中间的翻译规则,通常是根据中文与汉语拼音、汉语拼音与英文字母的两次转换关系完成的。

对于计算机网络,则会有 NAT完成IP地址间的转换,RAP/RARP完成IP地址与MAC地址的双向转换,DNS完成域名至IP地址的转换。

可是,为什么需要那么多不同命名空间的标识标识一个实体?可能最直观的回答通常是这样:

域名为了方便人的记忆与使用

IP地址是为了更广范围的计算机互联

MAC则是为了在物理上保证唯一

OSI开放系统互联7层模型决定的

人们会在不同的领域(也是命名空间)中定义自己的命名规范,这可以认为是领域主权的体现,同时伴生的会是一套与相关领域标识的转换协议

* 结构化与别名效应*

结构化是把数据的元信息以位置的方式固化是数据中。也就是说,代表某个意义的信息,一定会出现在一个约定好的位置上。

由于标识是被人经常使用的,那么在使用过程中会对大脑形成一定的训练。

人在看到了010-XXXXXXXX,021-XXXXXXXX号码之后,自然而言会产生条件反射,认为两者分别代表了北京和上海;同样的人在看到了139和186之后,分别产生了中国移动以及中国联通的运营商联想。

对于使用者,这种场景,数字类似是一个名称别名。对于程序员,这十分接近「数据字典」的设计模式。

* 标识转换过程的两面性*

别名和正名,同样是来自于两个不同命名空间的标识,之间自然而然的会进行转换。

当然,人们也不会忘记去Hack这些转换协议的设计。

一些是有益的,是实现了更为便利的应用场景。例如:将不同的域名指向相同的IP地址(使用A或者CNAME记录),并结合相关软硬件实现「虚拟主机」,达到资源复用的目的。

一些却是有害的,例如,诈骗电话也经常采用改号的方法,让接听者误以为那是来自某个官方的外呼电话。

同样的,在计算机领域,一样有DNS劫持、DNS污染。

有矛就有盾,进行安全性扩展的DNSSEC 就是为了对DNS结果,验证不存在性和校验数据完整性验证,不过依然没有实现全面部署。

* 小结*

在关注如何生成标识的同时,还需要关注标识的易用性和直观性

不同命名空间的标识,在互通时需要进行转换

转换的过程,可能是一个简单的规则,也可能是一个独立第三方服务

标识的唯一性是基本诉求,同时嵌入其他维度的信息是减少实时关联查询的有效手段

思路一:基于数据库生成

标识的生成方法有很多,有集中式的,分布式的;有后端的,前端的,当然还有人工的。并没有一种通用的生成方法来适应各种应用场景。

人工生成的确是一种方式,比如电子邮箱

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值