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

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

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

如服务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系统,要看业务。

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/507241.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mnist数据集svm python_python支持向量机分类MNIST数据集

支持向量机在高维或无限维空间中构造超平面或超平面集合,其可以用于分类、回归或其他任务。直观来说,分类边界距离最近的训练数据点越远越好,因为这样可以缩小分类器的泛化误差。调用sklearn.svm的svc函数,将MNIST数据集进行分类&…

mysql触发器可以使用正则表达式_SQL 正则表达式及mybatis中使用正则表达式

这篇文章主要介绍了SQL 正则表达式及mybatis中使用正则表达式的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下mysql 提供的模式匹配的其他类型是使用扩展正则表达式。当你对这类模式进行匹配测试时,使用REGEXP和NOT REGEXP操作…

python代码200行左右_200行Python代码实现2048

import cursesfrom random import randrange,chiocefrom collections import defaultdictactions[Up,Left,Down,Right,Restart,Exit]letter_codes[ord(ch) for ch in WASDRQwasdrq]action_dictdict(zip(letter_codes,actions*2))def main(stdscr):def init():#重置游戏棋盘game…

python将excel导入mysql_Python将Excel数据自动导入MySQL,python,实现,excel,到,中

废话不多说,下面附上代码。# -*- coding: utf-8 -*-"""Created on Mon Apr 20 14:18:49 2020author: admin"""import osimport pandas as pd#import cx_Oracle as cxfrom sqlalchemy import create_engineimport pymysqlfile_name[]#…

presto java_Presto Jdbc

Presto Jdbc标签(空格分隔): Presto一, 建立连接传统的JDBC方式类似,建立PrestoConnection”连接“,并且通过unwrap方法将connection转换为PrestoConnection。实际上是赋值一些基本信息,并且建立新的OkHttpClient。Str…

计算机二级java上机_计算机二级JAVA上机试题及答案

2016年9月计算机等级考试正在紧张复习中,为帮助大家进一步复习java,yjbys小编为大家带来最新java上机试题及答案如下:1. 基本操作(1小题,计30分)注意:下面出现的“考生文件夹”均为%USER%在考生文件夹中存有文件名为Ja…

java divide 用法_java中BigDecimal加减乘除基本用法

Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商…

如何反映两条曲线的拟合精度_你知道850加工中心定位精度的检测有哪些吗?

你知道850加工中心定位精度的检测有哪些吗?定位精度在机械制造上指零件或刀具等实际位置与标准位置(理论位置/理想位置)之间的差距,其差距越小,说明精度越高。定位精度是零件加工精度得以保证的前提。XFL-850加工中心的…

java ee最新_从此再无 JavaEE,现在叫 JakartaEE

各位小伙伴,你们都知道这个消息吗?Java EE 正式改名为 Jakarta EE 了。以后小伙伴们自我介绍的时候又多了一种方式。(〃▽〃) :你是做什么的?( ̄▽ ̄)~* :你好我是做 JakartaEE!Σ(っД;)っ&#…

十二月份找工作好找吗_小儿推拿师工作好找吗?工资高吗?

小儿推拿师工作好找吗?会不会学成之后找不到工作?作为现在比较热门的一个医学类职业,小儿推拿师还是比较容易找工作的,现在基本一条街上能有不低于十家小儿推拿店,而这些店里面小儿推拿师只有两三个,后面孩子还有很多…

java 单例 读写锁_终极锁实战:单JVM锁+分布式锁

目录1.前言2.单JVM锁3.分布式锁4.总结正文分割线1.前言锁就像一把钥匙,需要加锁的代码就像一个房间。出现互斥操作的典型场景:多人同时想进同一个房间争抢这个房间的钥匙(只有一把),一人抢到钥匙,其他人都等待这个人出来归还钥匙&…

怎么用python读取excel数据并导出_python怎样导入excel表格数据-如何使用python将大量数据导出到Excel中的小技巧...

如何用python将数据写入excel表格 #导入包 import xlrd #设置路径 pathC:\\Users\\jyjh\\Desktop\\datap.xlsx #打开文件 dataxlrd.open_workbook(path) #查询工作表 sheetsdata.sheets() sheets 可以通过函数、索引、名称获得工作表。 sheet_1_by_functiondata.sheets()[0] sh…

linux java socket编程_深入学习socket网络编程,以java语言为例

了解java的socket编程与Linux Socket API之间的关系一、java的网络编程1、socket原理socket通信就是通过IP和端口号将两台主机建立连接,提供通信。主机A的应用程序要能和服务器B进行通信,必须通过Socket建立连接,而建立Socket连接本质上就是依…

python去掉空白行_python去掉空白行的多种实现代码

这篇文章主要介绍了python去掉空白行实现代码,需要的朋友可以参考下 测试代码 php.txt1:www.php.cn 2:www.php.cn 3:www.php.cn 4:www.php.cn 5:www.php.cn 6:www.php.cn 7:www.php.cn 8:www.php.cn 9:www.php.cn 10:www.php.cn 11:www.php.cn 12:www.php.cn 13:www.php.cn 14:…

mysql 手动配置服务器_Win7系统下手动配置Apache+PHP+MySQL环境WEB服务器 -电脑资料...

本来想学学php,于是就想搭建web服务器和sql环境,结果浪费掉了不少时间,大致的总结下,也算是长个记性。使用的安装包分别是httpd-2.2.22-win32-x86-no_ssl .msi,php-5.2.5-Win32.zip和mysql-installer-community-5.5.28.3.msi,很显然用的还算是…

html get请求_99% 的人都理解错了 HTTP 中 GET 与 POST 的区别【面试必问】

先分析一波:1、GET和POST与数据如何传递没有关系??GET和POST是由HTTP协议定义的。那么使用哪个方式与应用层的数据如何传输是没有相互关系的。从而,HTTP就没有要求,POST一定要放到请求体里面,GET就一定要放…

java属于哪种语言_Java属于以下哪种语言( )_学小易找答案

【单选题】AT89s51单片机若晶振频率为fosc12MHz,则一个机器周期等于( ) μS。【单选题】下列选项中,不属于Java中关键字的是( )【简答题】写出力在坐标轴上投影计算的两条重要结论。【判断题】《周南桃夭》中多次出现的“宜”指的是适宜。【单选题】以下关于三元运算符的说法中…

hive load data外部表报错_生产SparkSQL如何读写本地外部数据源及排错

https://spark-packages.org/里有很多third-party数据源的package,spark把包加载进来就可以使用了csv格式在spark2.0版本之后是内置的,2.0之前属于第三方数据源一、读取本地外部数据源1.直接读取一个json文件[hadoophadoop000 bin]$ ./spark-shell --mas…

java中的throw_Java中的throw和throws之间的区别

throw和throws都是异常处理的概念,其中throw用于显式地从方法或任何代码块中引发异常,而throw在方法的签名中用于指示此方法可能抛出列出的类型之一例外。以下是throw和throws之间的重要区别。序号键扔抛出1定义Throw是一个关键字,用于在函数…

ffmpeg命令_使用ffmpeg命令为多个短视频修改视频备注说明

今天主要给大家讲一下使用视频剪辑高手中的ffmpeg命令为多个短视频修改备注说明的详细步骤,有需要和感兴趣的宝贝们可以跟随小编一起来试试。收集视频将需要剪辑的短视频保存到同一文件夹上进入软件双击进入视频剪辑高手,选择“批量剪辑视频”功能添加视…