今年一直在和团队做微服务的架构改造(相关的一些详情,有兴趣的朋友,可以参见之前的这篇分享)。但是做过改造的朋友都知道 从“All-In-One” 到 “Micro-Service” 都需要迈过的一个坎,那就是垂直分库, 根据不同的子服务,将数据库拆分为不同的子服务库。

那么问题就来了,在开始做微服务改造前,我发现在摇旺的老系统中,有很多后台报表或者前端详情页所需的数据是通过SQL Join来完成的。但是,我们微服务改造后,每个服务背后的数据库已经在分布不同的实例中了,所以我们已经不能继续简单在SQL中使用join了,那么解决“跨库Join”就摆上了议事日程。

通过讨论和调研,垂直分库后,对于“跨库查询”的解决,可以采用以下几个思路:

1. 依赖字段较少:字段冗余

A库中的Tab1表需要关联B库中的Tab2表中的字段F, 我们就将字段F冗余到表Tab1中,那么查询时候,Tab1和Tab2就不需要做Join,单独查A库中的Tab1表就可以解决问题。

这是一个野路子,因为这是违反正常的范式设计的,但在依赖字段较少的情况下还是可以解决问题的,达到空间来换取时间的目的。不过这个方法最大的短板在于2点: 1. 依赖字段不能太多,2. 数据一致性问题。Tab2中的F字段一但改变,必须要同步到Tab1中,否则就会引起脏数据的问题。所以,需要在业务代码建立必要的同步机制,如果出错,还需要考虑引入人工补偿。

2. 依赖字段较多:表同步

在很多场景下,我们字段的依赖是很多的,乃至查询的时候可能需要跨多张表,这个时候方法1就无法直接用了,我们就需要进行表级别的数据同步,可以采用ETL工具来做到跨库的表同步。不过需要注意的是,数据同步不建议实时性过高,否则数据库的性能会受到比较大的影响。所以对于实时性不高的查询要求,表同步还是比较奏效的。

3. 静态字段依赖:数据字典表

对于不同库中的静态字段,可以建立一张数据字典表,可以将这类表在其他每个数据库中均保存一份,从而避免跨库join查询。如果静态数据表中的某些字段数据需要修改,可以采用一套脚本统一更新。

4. 服务层代码进行数据组装

通过各种服务查询到一个数据集,通过代码进行二次组装,然后生成我们需要返回给前端的对象。在实践过程中,对于处理过的查询集,我们可以将它们缓存在我们的分布式缓存中,减少服务间的RPC调用次数和数据库的查询压力。同时,注意设置好过期时间,把控好数据一致性和有效性。

以上就是4种应对跨库Join的思路,实战中,一定是将这4类方案进行组合使用的,同时,需要注意的是,相比这些解决思路,更重要的是表结构的合理设计。否则要彻底解决跨库是很困难的。

分布式事务的处理方式

除此之外,分库后,还有一个难题,就是分布式事务的处理。具体的事例,可以参见我之前的这两篇文章1和 文章2。里面会提到在微服务下,服务间事务回滚的几个思路,希望对大家有用。

扫描二维码或手动搜索微信公众号【架构栈】: ForestNotes

欢迎转载,带上以下二维码即可

微服务改造中解决跨库问题的思路相关推荐

  1. 架构(二):如何对现有系统做微服务改造?

      很多早期的互联网公司都有巨大的单体应用,底层的数据表集中放在一个数据库里,这些表加起来可能有几百张.对于这样的应用系统和数据库,我们往往需要对它们进行拆分,通过微服务化改造,保证系统能够不断地扩展 ...

  2. 微服务改造过程中那些必须重视的问题

    "微服务"近几年尤其火热,各大厂都在进行微服务化改造和微服务建设,想享受微服务化带来的好处以便对自己的系统进行改造.分布式实验室特约记者李鹏采访了广州轻阅科技系统架构师陈珙,就微服 ...

  3. 如何解决微服务架构中的雪崩问题?

    记得在三年前公司因为业务发展需要,就曾经将单体应用迁移到分布式框架上来.当时就遇到了这样一个问题:系统仅有一个控制单元,它会调用多个运算单元,如果某个运算单元(作为服务提供者)不可用,将导致控制单元( ...

  4. 微服务架构中的雪崩问题产生原因及解决办法

    微服务架构中的雪崩问题产生原因及解决办法 参考文章: (1)微服务架构中的雪崩问题产生原因及解决办法 (2)https://www.cnblogs.com/panchanggui/p/10330924 ...

  5. PPT分享:基于事件解决微服务架构中分布式数据问题

    简介 本文主要介绍世界级软件架构师 Chris Richardson在2021年最新分享的PPT.PPT分享的标题是<Events to the rescue: solving distribu ...

  6. 罗辑思维首席架构师:Go微服务改造实践

    作者简介 方 圆 曾在Cisco负责流媒体工作,在微博负责feed系统研发,三年游戏行业开发经验,现任罗辑思维首席架构师,主导罗辑思维微服务改造. 内容大纲 1、  改造的背景 2.改造的过程中的 G ...

  7. 详解微服务技术中进程间通信

    以下文章来源方志朋的博客,回复"666"获面试宝典 在单体应用中,一个组件调用其它组组件时,是通过语言级的方法或者函数调用,而一个基于微服务的应用是运行于多个服务器上的分布式系统, ...

  8. 虎牙直播在微服务改造方面的实践和总结

    来源:阿里巴巴中间件 相比文字和图片,直播提供了人与人之间更丰富的沟通形式,其对平台稳定性的考验很大,那么倡导"以技术驱动娱乐"的虎牙直播(以下简称"虎牙")是 ...

  9. Java生鲜电商平台-SpringCloud微服务架构中分布式事务解决方案

    Java生鲜电商平台-SpringCloud微服务架构中分布式事务解决方案 说明:Java生鲜电商平台中由于采用了微服务架构进行业务的处理,买家,卖家,配送,销售,供应商等进行服务化,但是不可避免存在 ...

最新文章

  1. 2021年大数据常用语言Scala(十六):基础语法学习 列表 List 重点掌握
  2. 为什么要参加java培训?有哪些优势?
  3. Nature子刊:精胺介导稻瘟病菌侵染水稻叶片的新机制!
  4. mysql增备脚本--xtrabackup实现
  5. 字节数组和字符串的相互转化……
  6. Android 系统性能优化(43)---Android OOM案例分析
  7. MySQL5.5 RANGE分区增加删除处理
  8. 用python实现接口测试(八、实现序列化与反序列化)
  9. php降序怎写,php 数组排序(升序、降序及相关问题)
  10. 使用Hyper-V Server PowerShell
  11. redis-集群(cluster)扫盲篇(一)
  12. 报表制作1(传入对象和其他参数)
  13. html5 2.5d,修仙三国:首款HTML5三国背景2.5D角色扮演页游
  14. 太空中的特斯拉 一个大广告?
  15. java--输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
  16. matlab中得到透明背景图片的方法,如何在Matlab中得到透明背景的图片?
  17. 认识计算机重点知识,认识计算机教案
  18. tftpd32.exe的安装
  19. c语言字母是怎么存储,C语言之数据在内存中的存储
  20. 模板--二分图最大匹配

热门文章

  1. Android版本更新踩坑,Android Studio 3.0升级后踩到的坑
  2. 使用python下载文件_python使用socket实现上下载文件功能
  3. vim特殊符号的意义
  4. centos7怎么安装中文环境支持包
  5. linux ls 输出对齐,理解 Linux 中 `ls` 的输出
  6. 逆序输出螺旋字符矩阵(三种方法)
  7. 天翼云从业认证(4.8)高性能计算解决方案
  8. 信息系统项目管理师-信息系统立项管理核心知识点思维脑图
  9. Android中应用百度地图API开发地图APP实例-显示百度地图
  10. Java中使用Jedis连接Redis对SortedSet进行排序操作