速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

为什么总是需要无意义的 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:33839

评论

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

阿里云 DataWorks 正式支持 SelectDB & Apache Doris 数据源,实现 MySQL 整库实时同步

SelectDB

数据库 大数据 数据分析 数据迁移 整库同步

启信宝产业洞察:广东领跑低空经济,无人机产业强势崛起

合合技术团队

人工智能 算法 无人机 科技

湖南长沙正规等保机构名单以及地址看这里!

行云管家

等保 等保测评 长沙

压力测试,探索服务器性能瓶颈

测试人

软件测试

Grafana GreptimeDB 数据源插件上线啦,全面替代 Prometheus 插件

Greptime 格睿科技

Grafana 时序数据库 Promethues

GeoAI驱动土地价值重塑!中国地质大学(武汉)&和鲸社区Workshop圆满结束!

ModelWhale

Workshop 地球科学 geoai 遥感数据

探索电商平台API接入的多样路径

代码忍者

API 接口 pinduoduo API

Sentieon软件快速入门指南

INSVAST

基因数据分析 生信服务 Sentieon

【JIT/极态云】技术文档--模型简介

武汉万云网络科技有限公司

低代码 开发工具

MongoDB面试专题33道解析

威哥爱编程

数据库 mongodb 面试

RK品牌双十一狂欢,高颜值低延迟键盘超值体验!

科技热闻

腾讯云AI代码助手

全栈若城

数字化落地过程中的研发效能治理如何开展?

思码逸研发效能

DevOps 研发管理 绩效管理 研发度量 研发效能度量

王慧文回归带队美团探索 AI 应用;对话音频开源模型 Hertz-dev:120 毫秒超低延迟丨 RTE 开发者日报

声网

告别复杂判断!Python中实现函数重载的终极技巧

LLLibra146

Python 装饰器 函数重载

【等保小知识】等保测评等级从高到低怎么排序?

行云管家

等保 等级保护 等保测评

JAVA 应用实现 APM 自动注入(主机篇)

观测云

Java

解析Go切片:为何按值传递时会发生改变?|得物技术

得物技术

golang 扩容 切片

Reviewbot 开源 | 为什么我们要打造自己的代码审查服务?

大卡尔

DevOps Code Review 工程实践 静态代码检查

人工智能 | 文生图大模型

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

测试

鸿蒙接入Flutter3.22

龙儿筝

在后LLM时代,关于新一代智能体的思考

澜舟孟子开源社区

人工智能 智能体 大模型

高性能日志结构化引擎 — GreptimeDB Piepline 设计与实现技术揭秘

Greptime 格睿科技

时序数据库 日志储存 日志引擎

南开大学携手和鲸科技,以 AI 赋能交叉学科人才培养与课程建设

ModelWhale

Python 人工智能 新文科 南开大学

香港 Web3 一周大事记: 香港财政司司长表示,年内有望再发出多个虚拟资产交易平台牌照

TechubNews

GreptimeDB 首位独立 Committer Eugene Tolbakov 是怎样炼成的?

Greptime 格睿科技

开源 时序数据库

8+ 典型分析场景,25+ 标杆案例,Apache Doris 和 SelectDB 精选案例集(2024版)电子版上线

SelectDB

数据库 数据分析 经验分享 大数据 开源 案例集

制作并量化GGUF模型上传到HuggingFace和ModelScope

GPUStack

大模型 ModelScope LLM huggingface GGUF

制作并量化GGUF模型上传到HuggingFace和ModelScope

SEAL安全

大模型 ModelScope LLM huggingface GGUF

怎么自动保存ppt?3个必备的ppt使用技巧分享!

职场工具箱

人工智能 效率工具 办公软件 AIGC AI生成PPT

主机上云,八仙过海?!

白洞计划

AI

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