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

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

解决方案

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

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值