微服务架构中,每个服务都有自己的独立数据库。

然而现在有个需求,需要生成一张实时的报表,该报表包含两个服务的数据。

如服务A,服务B。B中仅包含A的主键id作为关联。

而此报表的搜索条件包含A服务实体中的字段也包含B服务实体中的字段。

现有方案

1、如果搜索条件中包含A的条件,则先去服务A中搜索,得到所有结果的主键,在服务B中使用where A.id IN (ids) 再次查询

想法:当A.id数量庞大时,这个查询极其缓慢! 而A.id数量庞大的情况很多

2、使用搜索引擎

想法:感觉杀鸡用牛刀

请教各位大牛有更好的方案吗

回答

其实这种问题在微服务中很常见,比如说需要通过商品上的一些信息查询订单,订单和商品分别属于两个微服务,该类问题的解决方案除了你自己两种方案,还有

将数据聚合放入数据仓库,实时聚合A和B中的数据放入另外一个库中(不一定是mysql,也可以是Hbase),报表拉的数据都从数据仓库中拉去

表设计的时候适当冗余一些字段,就如你说的在B上可预见性的冗余一些A的字段

方法1有一个很致命的缺点,一旦涉及到分页,这种方式必定不可行.具体采用哪种方案,还是需要根据你的数据对应的数量级来决定,如果对应的数据量不是很大,可以采用方法1,如果速度比较慢,可以多开几个线程分批捞相应的数据(id数量太多分批拉,批量查询都是可以减少超时情况和时间的有效解决方案);如果数据量很大,建议采用数据仓库的方式,采用数据仓库的主要好处是,对主库不会产生压力,因为聚合表的产生可以通过Binlog来获取;因为报表还是属于离线数据的范畴,如果真的需要像订单查询那样实时,效率很高期间还伴随着状态的该表,并且搜索条件巨多无比,那么搜索引擎是一个很好的选择

所以,可以根据实际情况采用方法1和方法3

泻药

如果是线上业务数据(OLTP),那么方案一是微服务的标准做法。如果线上要频繁做这种关联的查询,就说明两个服务(及其两个库)的耦合非常严重,那当初何必要把它们拆开来呢?

如果是分析报表,那就属于OLAP范畴了,方案二确实是一种可取的方案。如果使用搜索引擎觉得杀鸡用牛刀的话,不妨试试在从库上做各种报表分析操作,比如线上的A库和B库都实时同步到一个只读库中,然后在只读库里JOIN一下就搞定了。

生成报表这样的需求就不应该放在业务数据库系统中,你可以在后端做一套otter汇聚库,实时同步多个服务的数据进来,然后在这个汇聚库中你想怎么玩就怎么玩

方案一采用in的方式,很多接口都需要通过in的方式查询,当碰到分页查询这种根本不好处理。

方案二感觉还没到使用搜索引擎的地步。

1、传统方式,在业务系统A中存入要查询的B业务系统的冗余数据,便于查询。

至于这个冗余数据何时进入A系统,要看业务。

微服务的一个设计原则是业务没有关联的服务拆开成单独的服务,你这个业务之间有交叉了。

你好,我这边也有类似的困扰,请问你采用了什么方案呢

mysql微服务查询问题_【mysql】微服务架构下跨服务查询的聚合有什么好的方案?...相关推荐

  1. 微服务架构下的服务关联图

    2019独角兽企业重金招聘Python工程师标准>>> 在微服务架构下,服务之间的关系是非常复杂的,是一个典型的有向有环图,在一个中等规模的项目中,一般会有100多个服务,而大型项目 ...

  2. K8S 在微服务架构下做服务注册中心的一种思路

    K8S 在微服务架构下做服务注册中心的一种思路 使用 K8S 的 Service 和 DNS: 每个微服务 都在 K8S 中创建一个 Service ,名起名比如: user.xingren.host ...

  3. 微服务架构下的服务调用与鉴权——某保险公司微服务平台实施案例分享

    2019独角兽企业重金招聘Python工程师标准>>> 转载本文需注明出处:EAWorld,违者必究. 引言: 根据保险行业发展趋势,目前保险交易已经呈现高频化.碎片化.场景化等特点 ...

  4. 云原生架构下日志服务数据预处理

    简介:本篇实践将以某家国际教育机构为例,为大家详细介绍云原生架构下日志服务数据预处理以及对应的解决方案和最佳实践操作手册,方便用户快速对号入座,解决云原生架构下的常见日志难题. 直达最佳实践:[htt ...

  5. mysql 5 7 教程视频_[MySQL] MySQL 5.7从入门到精通视频教程

    资源介绍 目录 ├─MySQL常用命令大全.pdf ├─视频教程 │xa0xa0├─第10讲 存储过程和函数 │xa0xa0│xa0xa0├─10.1xa0xa0创建存储过程和函数.avi │xa0x ...

  6. mysql数据库访问问题吗_#MySQL数据库无法远程访问的问题

    在 Ubuntu上装了mysql,因为项目的数据库是mysql,将项目放在tomcat里面webapp下面,一直启动不成功.本来一直以为是jdbc驱动问题,后来发现不是. 1.cd /etc/mysq ...

  7. ubuntu mysql数据储存在哪里_如何更改在Ubuntu下的MySQL数据库存储位置?

    在默认的数据库存储位置下就会有个文件夹mysqldb.要操作数据库首先得停止数据库进程: $sudo /etc/init.d/mysql stop 本文以转移到/home/mysql这个位置为例,下面 ...

  8. 微服务架构下的 服务熔断, 降级, 限流

    微服务架构下存在的 '雪崩' 问题 在微服务架构中, 一个请求需要调用多个服务是非常常见的. 如客户端访问订单服务, 而订单服务需要调用库存服务, 库存服务需要调用配送服务, 由于网络原因或者自身的原 ...

  9. MySql数据库explain用法示例_[MYSQL]-EXPLAIN用法

    EXPLAIN简介 当我们需要优化一个SQL语句的时候,我们需要知道该SQL的执行计划,比如是全表扫描,还是索引扫描:在MySQL中我们可以通过EXPLAIN去完成,EXPLAIN命令是查看优化器如何 ...

最新文章

  1. C++编程优化——让你的代码飞起来
  2. 前facebook产品技术leader徐玮:如何建立用户增长机制
  3. echarts饼状图mysql_echarts饼状图位置设置
  4. 深入理解java虚拟机JVM(上)
  5. C++实现离散余弦变换(参数为二维指针)
  6. Cookie介绍与操作
  7. go语言中常用的关于文件目录的操作
  8. 《和平精英》迎来史上最严封号:模拟器过检测、手机外设全部凉凉?
  9. 【AI初识境】从3次人工智能潮起潮落说起
  10. 小米路由r2d论坛_小米路由器R2D固件 V2.24.10 官方稳定版
  11. 【PC工具】压缩包密码破解工具,暴力破解压缩包密码,zip密码获取
  12. mongoDB数据库安装报错问题SocketException: Error connecting to和Shutting down
  13. 护眼灯买什么样的好?这几款2022年最佳的护眼灯值得一看!
  14. https证书不安全是什么原因?
  15. A*搜索算法——图形搜索算法
  16. Java开发指南!java生成word文档修改样式
  17. STL中的for_each()函数
  18. 实用软件/浏览器插件/网站合集(个人向,更新中)
  19. python的图形界面库wxpython的快速简单使用
  20. 微积分小课堂:微分(从宏观变化了解微观趋势)

热门文章

  1. duilib中界面的布局方式
  2. bat脚本如何自动输入y_在Mac如何写一个相对自动的翻译脚本
  3. 如何将计算机加入到域环境中,如何在讲计算机加入一个WinXP的域环境
  4. java数组图片_在JAVA中定义图片数组
  5. 顶级程序员的心得–Coders at Work
  6. proxytable代理不生效_民法典房屋买卖合同卖方代签合同生效吗
  7. python网站框架下载_web.py首页、文档和下载 - Python框架 - OSCHINA - 中文开源技术交流社区...
  8. 口琴膜片什么作用_2020年半音阶口琴选购攻略,让小白告别选择困难
  9. 如何延长作用域链_通过实例理解javaScript中的this到底是什么和它的词法作用域...
  10. verilog 浮点转定点_定点数和浮点数