微服务间数据跨库关联

在微服务环境下,不同服务之间会出现数据库独立情况,不可避免的需要跨库关联JOIN。例如:订单服务、商品服务、用户服务等,在独立分库后分别对应订单数据库、商品数据库、用户数据库。在查询订单是需要携带用户信息+商品信息,就出现了跨库join的使用场景。

解决方案:

0、高耦合数据不分库。

1、数据冗余:在订单数据库订单表中,保存商品和用户完整信息。优点:sql简单且性能高。缺点:空间浪费且商品信息更新需要同步。

2、SQL语句级别的跨库:在select语句中直接连接其他数据库表实现join。优点:简单对系统改动小。缺点:影响数据库性能。

3、公共表:商品表、用户表等基础信息在每个数据库都保存一份。优点:sql简单且性能高。缺点:空间浪费且需要数据同步。同步方案:MQ消息总线广播(各个服务监听)、定时任务(可以检查数据最后更新时间)、Cancl监听数据库 等。

4、数据中心:各个库异步同步到数据中心,做统一查询搜索平台。可以使Mysql、Redis、ES等。优点:查询简单高效。缺点:空间浪费且需要数据同步。

5、MyCat、ShardingJdbc等中间件。

6、代码聚合:分别调用各服务API获取信息后,代码遍历统一组装Object。利用数据结构特点通过代码实现SQL。代码处理大数据。

     缺点:代码量大且数据量大时组装耗时。推荐利用各种数据结构特点、多线程分治查询/组装Object提高效率。

                注意:尽量减少IO/SQL的次数。使用过期缓存结果减少远程调用、查询和组装的频率。可以做成定时任务生成缓存、缓存击穿防护

你可能感兴趣的:(java,数据库)