标识(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结果,验证不存在性和校验数据完整性验证,不过依然没有实现全面部署。
* 小结*
在关注如何生成标识的同时,还需要关注标识的易用性和直观性
不同命名空间的标识,在互通时需要进行转换
转换的过程,可能是一个简单的规则,也可能是一个独立第三方服务
标识的唯一性是基本诉求,同时嵌入其他维度的信息是减少实时关联查询的有效手段
思路一:基于数据库生成
标识的生成方法有很多,有集中式的,分布式的;有后端的,前端的,当然还有人工的。并没有一种通用的生成方法来适应各种应用场景。
人工生成的确是一种方式,比如电子邮箱