本模块的前几讲里围绕着分库分表,以及外部依赖治理的话题进行了讨论,通过上述方案来提升写业务的高可用和高性能。
但分库分表以及无状态存储也带来了另外一个问题,即数据按路由规则分散后,如何满足无路由字段的多维度富查询?
异构定制化实现
在“第 8 讲”,我介绍了一个关于订单模块的分库分表案例,我们先回顾一下该方案的处理方式:
-
在提交订单时,采用用户账号作为分库字段;
-
在查询时,只有携带用户账号的 SQL 才能直接执行;
-
在下单后,售卖商品的商家可能希望查询自己店铺里的所有订单,此时按用户维度的分库分表则不能满足上述查询需求。
为了满足和原有分库维度不一样的查询,最简单的方式是按新的维度异构一套数据,它的架构如下图 1 所示,数据异构可以采用在本专栏模块二中介绍的 Binlog 进行处理。
图 1:数据异构架构图
采用数据异构满足了上述按商家维度查看数据的诉求,但如果又来一个新的需求,需要按订单所属的来源(小程序、App、M 页或者 PC 站点)进行订单数据查询呢?此时,是否需要按来源维度进行数据异构呢?
答案显然是不行的,主要有两个原因:
-
一是数据同步程序需要开发,如果来一个新需求就开发一套同步,浪费人力成本;