10 月 23 - 25 日,QCon 上海站即将召开,现在购票,享9折优惠 了解详情
写点什么

为什么总是需要无意义的 ID ?(二)

  • 2019-12-27
  • 本文字数:2139 字

    阅读完需:约 7 分钟

为什么总是需要无意义的 ID ?(二)

唯一性

消息队列往往需要对外保证服务质量,可能需要提供包括最多一次、最少一次和正好一次在内的服务质量,由于网络可能存在超时等不确定性,当我们想要实现正好一次时,就一定需要一种机制能够在接收方识别发送方发出的重复消息,在这时就需要使用唯一的标识符来解决这个问题:



我们在之前的系列文章 为什么 TCP 建立连接需要三次握手 提到的 TCP 连接中的序列号也是一个唯一的标识符,它能够帮助我们判断对数据进行去重,保证应用层的协议不会收到异常的数据包,这些场景都需要用到标识符的唯一性,唯一性为我们带来的就是精确识别对象的能力。


在与网络相关的场景下,使用唯一 ID 的例子非常普遍,假如我们想通过支付宝或者微信的 API 向其他人发起一笔转账,如果这次请求发生了超时,那么我的这笔转账请求到底有没有被处理呢?



当前的节点对于这笔转账请求的结果是不知道的,如果这时重新请求可能会发生二次转账这类严重的问题,但是如果不重新请求,转账可能没有生效,这时如果我们引入一个无意义的 ID 来帮助接收方识别请求的唯一性就能很好地解决这个问题:


  1. 如果接收方已经成功处理 ID 对应的请求,那么就直接返回;

  2. 如果接收方没有处理 ID 对应的请求,就正常进行处理;


为了保证请求的唯一性,根据业务对于唯一性要求的强弱,我们需要在接收方对 ID 进行存储,可以在内存中,也可以在数据库中,最重要的是唯一的 ID 为接收方提供了判断重复的重要依据。


除了在不稳定的网络中,数据库也包含 ID 标识符这一概念,我们在数据库中往往叫做主键,它在一般情况下都是一个递增的唯一整数,绝大多数的表都会使用 ID 作为表的主键来保证数据的唯一性,当我们想要对数据进行增删改查等操作时,使用主键 ID 查询数据也是性能最优并且最不容易出现问题的做法。

无意义

无意义的意思其实就是 ID 中不应该包含任何与具体场景或者业务相关的内容,包含这些内容并不是不可以,只是一旦出现这些内容,要么 ID 重复的可能性会增加,这很可能对我们的业务逻辑造成比较严重的影响,以我们的身份证号为例,它的 18 位数字(或符号)大多都是有意义的。



这 18 位数字中的前 6 位表示的是地区,也就是省份、城市和区县,随后的 8 位表示的是出生年月日,接下来的 3 位才同时表示 ID 和性别,最后 1 位用于做校验码防止出现身份证号输错的情况。用上述图中的黄色部分中有一半的数字是用来表示出生的男性,另一半表示出生的女性,所以如果同一个地区的同一天,同时出生了 501 位男性或者女性就会导致潜在的重复问题。


上面谈到的问题其实也是我们在各种业务场景中经常能够遇到的问题,18 位的数字中真正用于表示序列的 ID 其实只有 1000 的一半,如果 18 位数都是无意义的,那它们可以表示 10 亿亿个人,但是一旦在 ID 中引入了业务上的具体信息,就增加了冲突的可能性。


业务记录上主键的长度往往都是固定的,大多数业务的主键都会使用整数,它的上限一般就是 2^64,如果这些位数都用来表示记录的 ID,那么在有生之年基本上是不可能被使用完的,但是一旦我们将业务信息加入 ID,就会让原本无意义的 ID 变得有意义从而影响它的唯一性。


另一个比较类似的例子其实是分布式的 ID 生成器,Snowflake 算法会为 64 个比特的整数赋予不同的信息:


范围长度作用
0-01不使用
1-4141毫秒级时间戳
42-465数据中心标识符
47-515机器标识符
52-6312序列号


从这个设计来看,我们的假设其实是一台机器上一毫秒最多只能生成 4096 个 ID,一旦超过了这个这个数量就有可能导致 ID 冲突或者乱序,从而失去其唯一性;这个算法中涉及的时间戳、数据中心标识符、机器标识符都没有办法解决唯一性的问题,哪怕这三者完全相等,最终还是有冲突的可能,我们仍然需要使用无其他意义的序列号来保证 ID 的唯一。

总结

其实不难看出,使用无意义 ID 的主要目的就是利用它的唯一性保证对象的标识符不会发生冲突,无意义 ID 的唯一作用就是保证唯一性,这能帮助我们避免业务字段可能存在潜在冲突的可能,这也提示我们想要使用联合字段构成主键时一定要深思熟虑。


如果我们想要在具有唯一性的标识符中加入业务信息,一定要注意这可能会减少用于保证唯一性的『空间』,当然对于一个足够大的空间来说,这其实并没有什么问题;但是类型为 int64 的 ID 中加入业务数据还是需要仔细思考可扩展性以及预留的信息是否足够业务的发展。


到最后,我们还是来看一些比较开放的相关问题,有兴趣的读者可以仔细思考一下下面的问题:


  • 软件工程还有哪些场景利用了 ID 的唯一性?

  • 在日常生活中除了身份证号之外,还有哪些 ID 也有比较高的冲突可能性?


如果对文章中的内容有疑问或者想要了解更多软件工程上一些设计决策背后的原因,可以在博客下面留言,作者会及时回复本文相关的疑问并选择其中合适的主题作为后续的内容。

相关文章


本文转载自 Draveness 技术博客。


原文链接:https://draveness.me/whys-the-design-meaningless-identifier


2019-12-27 11:331114

评论

发布
暂无评论
发现更多内容

嘉为蓝鲸CMeas研发效能洞察平台:3秒精准定位研发效能报表,筛选+置顶双助力

嘉为蓝鲸

研发效能 仪表板 研发效能度量 研发效能洞察平台 研发效能报表

打造弹性 TCP 服务:基于 PoW 的 DDoS 防护

俞凡

golang 架构

Flink 与Flink可视化平台StreamPark教程(开篇)

天翼云开发者社区

大数据 flink

网站DNS解析失败的原因有哪些?

国科云

Flink和StreamPark自定义UDF函数的使用

天翼云开发者社区

MySQL flink

CST的超材料光子晶体---60度周期布里渊区

思茂信息

cst CST软件 CST Studio Suite

出海遇冷?用这几招快速点燃跨境电商第一波流量

Wolink

电商 出海企业 海外营销推广 沃链Wolink 达人营销

数字孪生项目外包开发的流程

北京木奇移动技术有限公司

数字孪生 软件外包公司 webgl开发

DeepSeek冲击(含本地化部署实践)

京东科技开发者

RFID技术没有改变世界,但它正在重塑细节

斯科信息

RFID技术 RFID系统 RFID通道机 RFID设备 RFID模块

嘉为蓝鲸CTeam敏捷协同平台:自动化研发流程覆盖多角色,降本提效双丰收

嘉为蓝鲸

研发效能 研发协同 研发项目管理 敏捷协同平台 敏捷协同

转转客服IM系统的WebSocket集群架构设计和部署方案

JackJiang

网络编程 即时通讯 IM

开源浪潮激荡,智驱能源革新:MyEMS 如何破局重塑能源管理新范式

开源能源管理系统

开源 开源能源管理系统

3DXML格式是什么?用什么软件可以打开?

在路上

cad cad看图 CAD看图王

区块链 DApp 开发技术方案

北京木奇移动技术有限公司

dapp开发 区块链开发 软件外包公司

告别手动低效!嘉为蓝鲸WeOpsV5.25:AI日志检索+专业监控视图,双料提升运维体验

嘉为蓝鲸

智能运维 IT运维 一体化运维 运维效率 一体化智能运维平台

为什么说BeeWorks适合成为企业承载业务的“超级底座”?

BeeWorks

即时通讯 IM 私有化部署

私有化部署Dify构建企业AI平台教程

测吧(北京)科技有限公司

数据库高频面试十问

王中阳Go

数据库 面试题

我如何用Prompt工程将大模型调教成风控专家

京东科技开发者

[成都信息工程大学主办]2025年第五届人工智能与智能制造国际研讨会(AIIM 2025)

搞科研的小刘

人工智能 投稿 智能制造 学术会议 国际研讨会

DOLANSUN多兰笙--多兰笙:高端羊绒新机遇

跑一跑

羊毛

企业IT可观测痛点破解!嘉为蓝鲸全栈智能可观测中心V4.5:全景观测拓扑+业务黄金指标洞察一站式解决

嘉为蓝鲸

AIOPS 可观测 可观测平台 智能可观测平台 IT运维监控

3DXML格式文件用什么软件查看?

在路上

cad 3dxml预览

企业内网IM软件怎么选?

BeeWorks

即时通讯 IM 私有化部署

京东商品详情API参数构造指南:必填参数与自定义字段配置

tbapi

京东API 京东商品数据采集 京东商品详情API 京东数据采集 京东数据分析

一个MES项目,是软件重要还是实施重要?

万界星空科技

生产管理系统 mes 数字化工厂 万界星空科技 制造业工厂

海外社交媒体分析如何助力舆情监测网站迭代升级

沃观Wovision

社交媒体 沃观Wovision 舆情监测系统 海外舆情监测

WeOps认证中心上线啦:三步获取电子证书,CA/CE/CD认证助力运维成长

嘉为蓝鲸

智能运维 weops 技术认证 一体化运维 运维人员

海量数据如何“安家”?一文读懂哈希、范围和一致性哈希三大分片策略

poemyang

分布式 分布式系统

理论到实战,高可用架构踩坑说明书

京东科技开发者

为什么总是需要无意义的 ID ?(二)_文化 & 方法_Draveness_InfoQ精选文章