微服务下数据关联查询问题及解决方案

154 阅读2分钟

在微服务下如何做“关联查询呢”

假定服务

服务数据
用户服务用户ID 用户昵称
帖子服务帖子标题 用户ID

假定需求

用户需要获取帖子列表,帖子列表每一个帖子都是有发帖人的昵称的。而发帖人昵称在用户服务下。

主流解决方案

一、给帖子加用户昵称冗余字段。(发帖时写入)

伴随问题

  • 用户修改昵称,冗余不一致

    解决方法:

    1.帖子服务开个昵称同步接口

    2.当用户修改昵称时用户服务调用帖子服务同步接口

    3.帖子服务把所有冗余字段更新

    该解决方案问题:

    性能消耗大,用户修改一次昵称,冗余的数据都得做变动

二、每次获取帖子列表的时候,去请求用户服务获取到该些用户的昵称,插入到列表里。(hash join)

伴随问题

  • 增加开发成本,帖子服务需要开获取接口,帖子服务做相应的调用的开发
  • 增加处理时间,服务间相互请求的和处理的时间
  • 性能消耗,调用两个服务去做同一个工作

三、做个单独的的查询服务

同步各个服务的数据库到一个只读数据库,在查询服务业务里做关联查询。

伴随问题

  • 开发成本剧增
  • 如果各服务用的数据库不一样,则适配起来很麻烦
  • 如果各服务使用分库模式的多组户系统,同步将是地狱
  • 各服务业务变动则可能需要查询服务也做出相关变动

四、分服务但不分数据库,由各个服务任意自己做关联查询

伴随问题

  • 分服务不分库,属于过渡阶段的做法,后期不可取
  • 各个服务使用同一个数据库,数据库压力倍增

五、借用Redis进行数据同步

1.各个微服务连接同一个Redis

2.在用户服务启动时将用户昵称写入到Redis中

3.帖子服务从Redis中按规范读取

4.用户修改昵称时同步数据库内容

伴随问题

  • 开发成本增加,需要各个服务统一从Redis中读取数据的格式

六、业务不到两亿美元,放弃微服务 [狗头]