探讨话题:
分布式系统中真的有必要使用分布式ID吗?
在网上大多数写分布式ID文章的观点是,微服务中由于数据量大会对数据进行分库分表处理,所以需要用到分布式ID,避免使用msyql自增ID造成ID冲突。
但是我想说的是就算分库分表,它也是根据某个字段进行hash或者rang分片规则来决定数据存储在哪个数据库节点上的。所以我们写sql查询语句的时候,where条件语句中肯定是需要带上分片规则指定的字段来查询,这样可以洛到具体的节点查询数据,不可能遍历所有数据节点查数据,我想这在高并发的场景里是绝对不被允许的。
那既然是这样的话,我想分布式ID在这里根本就没有必要使用。直接使用mysql的自增ID即可,只不过这里的ID其实没有实际的业务意义。
至于标识数据的唯一性,我想使用UUID生成即可满足业务需求。
针对这种架构层面上的东西,我向来主张一句话:软件工程没有银弹。
这句不是我编的,而是 IBM 大型机之父 —— 布鲁克斯的原话。他有本书你应该听过,就是著名的《人月神话》。
具体问题需要具体分析,并不存在一个放之四海而皆准的架构设计原则。你给的场景信息太少,单单一个“微服务”恐怕很难给出具体的结论,这本来就是公说公有理、婆说婆有理的事情 —— 毕竟谁也不知道你要面对的业务是什么。
我只能抛出一个可能存在的问题:用 DB 自增键做分布式 ID,那么对于大量插入操作而言,是不是瓶颈落在了 DB 上?如何高可用?如果用分库分表+设置步长的方式,如何扩容?
如果你的答案是通通不需要,那确实引入一个额外的分布式 ID 方案,除了增加系统复杂度之外,别无他用。