因为微服务技术发展迅猛,在咱们的架构中,每一个微服务都会相应的对接一个数据库,各个数据库之间有关联的表(好比用户表、业务表等)会互相同步数据,其余的数据操做各自独立(如日志表、操做表等),这么设计是基于性能考虑下降数据库容量及尽最大努力避免性能遭遇瓶颈。这么设计对于container来讲确实是极友好的,在平常运维中,好比每个月/季度的数据汇总就难受了,身为DBA,处理跨表查询应该是小case,然而在hibernate跨表查询中,虽然麻烦但仍是啃一下仍是能够解决的。然而最近接到的需求倒是要,跨!库!联!查!
我在想微服务的背景下,跨库查询应该是新常态mysql
单库时,系统中不少列表和详情页所需数据能够简单经过SQL join关联表查询;然而多库状况下,数据可能分布在不一样的节点/实例上,不能跨库使用join,此时join带来的问题就很棘手了。web
咱们在开发过程当中,链接数据库一个链接也是只能连一个数据库这个是常规操做,例如sql
db1 = pymysql.connect("11.22.33.44", "yerik", "mimajiubiekanla", "shujukuming1", port=3306)
若是咱们要查询另外一个数据库呢?不就要,再创建一个链接嘛数据库
db2 = pymysql.connect("55.66.77.88", "yerik", "mimajiubiekanla", "shujukuming2", port=3306)
这个怎么可能用join操做,可能有读者想要杠一下,说,能够经过xx操做在代码层面进行开发,可是,这样的代码可读性有多强?另外就代码审查来讲,也不会让你这么写,万一某一天你甩锅离职了,这天花乱坠的代码,谁受得了?
不过嘛,办法总比困难多的——视图。利用视图,咱们能够很是简单的实现这样的跨库查询的需求。咱们知道所谓视图,其实就是存储的查询语句,当调用的时候,产生结果集,视图充当的是虚拟表的角色。所以:django
一开始我也是被我这个想法惊讶到了,总以为跨库建视图太过于惊悚了,毕竟实践是检验真理的惟一标准嘛,随手就在navicat上面创建一个视图,以后运行架构
很是神奇~~那问题这样就解决啦,仍是一条SQL语句就能够解决问题了运维
经过这个思路,其实能够继续推广:跨表联查,建个视图,跨库联查,建个视图。建就完事了。另外这个操做其实还须要考虑数据同步的问题,由于是多库联查,若是数据不一致会是灾难的,这个具体问题要具体分析,加锁或者配置同步策略这些都是常规方案,因为我没有这个需求,就不展开讨论啦。ide
这个案例对我来讲颇有感触微服务