分库分表后如何解决不同维度查询的问题

背景
大家在进行分库分表的时候应该有碰到一个问题,一个数据需要根据两种维度进行查询,但是我们在进行分库分表是只能根据一种维度进行。比如:用户购买了商品产生了订单,当用户非常多的时候,我们会选择订单根据下单用户的ID进行分库分表。但是这里面存在一个问题就是作为卖家要如何查询我卖出的所有订单呢?因为订单是根据用户id规则进行分库分表的,卖家订单查询接口物理上是无法一次查询出当前的订单的,应该他分别分布在不同的订单库或者订单表中的,有可能我查询一个订单列表,需要跨非常多的表,这个样性能是非常低效的。有没一种有效的方法解决这个问题呢?

解决方案

那就是数据冗余,之前提到过的datax 数据同步框架可以有效的帮我们解决这个问题,我们分别建立两个订单库,一个基于买家维度、一个基于卖家维度,通过datax 把买家库的订单同步到卖家维度的订单库中,这样就能够很好的解决卖家查询订单跨库的这个问题。当然这里面还存在一个缺陷就是datax并不是实时的机制,他是通过定时的机制进行数据同步的所以会存在一定的延迟,当然我们可以把定时的周期调整小一点,但是这样会比较浪费性能。更加友好的解决方案还可以通过canal、otter。 otter是一个分布式数据库同步系统他是基于canal再次封装开发的,当然canal也有他的优点就是定制化比较强,他可以和主流的kafka rocketmq进行集成,然后我们在去处理这块数据同步的业务,这些都是很好的方案。最后还有一种方案就是基于CQRS的领域事件的思路进行的,领域事件有一个好处就是一个事件可以被多个消费者消费,这个是以往的RPC调用无法具备的。卖家订单系统可以订阅这个订单创建事件,写入订单卖家维度数据库中,也可以非常高效的解决这个问题。以上的方案其实都是非常合理的方案,个人还是更喜欢基于领域事件的形式进行同步,因为不需要再引入过多的外部组件,造成系统的负责度上升。使用canal 、otter的方案我们都需要做数据库的binglog同步操作,这个很多时候会被限制,我们压根没有权限去配置这些东西。所以还是建议通过领域事件的方式解决以上的问题。

 

 

已标记关键词 清除标记
相关推荐
<p> <b><span style="background-color:#FFE500;">【超实用课程内容】</span></b> </p> <p> <br /> </p> <p> <br /> </p> <p> 本课程内容包含讲解<span>解读Nginx的基础知识,</span><span>解读Nginx的核心知识、带领学员进行</span>高并发环境下的Nginx性能优化实战,让学生能够快速将所学融合到企业应用中。 </p> <p> <br /> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <b><br /> </b> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <b><span style="background-color:#FFE500;">【课程如何观看?】</span></b> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> PC端:<a href="https://edu.csdn.net/course/detail/26277"><span id="__kindeditor_bookmark_start_21__"></span></a><a href="https://edu.csdn.net/course/detail/27216">https://edu.csdn.net/course/detail/27216</a> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 移动端:CSDN 学院APP(注意不是CSDN APP哦) </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 本课程为录播课,课程永久有效观看时长,大家可以抓紧时间学习后一起讨论哦~ </p> <p style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <br /> </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <strong><span style="background-color:#FFE500;">【学员专享增值服务】</span></strong> </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <b>源码开放</b> </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 课件、课程案例代码完全开放给你,你可以根据所学知识,自行修改、优化 </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 下载方式:电脑登录<a href="https://edu.csdn.net/course/detail/26277"></a><a href="https://edu.csdn.net/course/detail/27216">https://edu.csdn.net/course/detail/27216</a>,播放页面右侧点击课件进行资料打包下载 </p> <p> <br /> </p> <p> <br /> </p> <p> <br /> </p>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页