当前位置: 首页 > news >正文

微服务中4种应对跨库Join的思路

   微服务或soa服务化,可以把一个大系统划分为n个小系统,独自运行,就意味者垂直分库,垂直分库就意味者数据层面的查询需跨库查询,应对的解决方案:
    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类方案进行组合使用的,同时,需要注意的是,相比这些解决思路,更重要的是表结构的合理设计。否则要彻底解决跨库是很困难的。

相关文章:

  • 如何选择最适合的图纸加密软件?用户体验及性价比
  • 同一台宿主机上虚拟机CPU资源分配方式介绍
  • 【Redis实战】有MQ为啥不用?用Redis作消息队列!?Redis作消息队列使用方法及底层原理高级进阶
  • 剑指offer面试题16 反转链表
  • 【栈】150. 逆波兰表达式求值
  • 面向对象编程入门:掌握C++类的基础(1/3)
  • MCU中断控制
  • CSRNET图像修复,DNN
  • http协议与apache
  • STM32_ESP8266 连接阿里云 操作图解
  • CSS中伪元素和伪类的区别和作用?
  • Vue3实现带动画效果的tab栏切换
  • Elasticsearch:创建自定义 ES Rally tracks 的分步指南
  • C++结合Lambda表达式在函数内部实现递归
  • MapboxGL JS⽀持哪些地图样式和交互控件?
  • 「面试题」如何实现一个圣杯布局?
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • Angular 响应式表单 基础例子
  • Angular4 模板式表单用法以及验证
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • CSS中外联样式表代表的含义
  • ESLint简单操作
  • git 常用命令
  • javascript从右向左截取指定位数字符的3种方法
  • Java知识点总结(JavaIO-打印流)
  • MySQL几个简单SQL的优化
  • nginx 配置多 域名 + 多 https
  • node学习系列之简单文件上传
  • spring boot下thymeleaf全局静态变量配置
  • Unix命令
  • windows下mongoDB的环境配置
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 官方解决所有 npm 全局安装权限问题
  • 缓存与缓冲
  • 记一次删除Git记录中的大文件的过程
  • 聊聊redis的数据结构的应用
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 前端性能优化--懒加载和预加载
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 物联网链路协议
  • ​linux启动进程的方式
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • (003)SlickEdit Unity的补全
  • (三)docker:Dockerfile构建容器运行jar包
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (十)T检验-第一部分
  • (一)80c52学习之旅-起始篇
  • (一)u-boot-nand.bin的下载
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .Net的C#语言取月份数值对应的MonthName值