在微服务下如何做“关联查询呢”
假定服务
| 服务 | 数据 |
|---|---|
| 用户服务 | 用户ID 用户昵称 |
| 帖子服务 | 帖子标题 用户ID |
假定需求
用户需要获取帖子列表,帖子列表每一个帖子都是有发帖人的昵称的。而发帖人昵称在用户服务下。
主流解决方案
一、给帖子加用户昵称冗余字段。(发帖时写入)
伴随问题
-
用户修改昵称,冗余不一致
解决方法:
1.帖子服务开个昵称同步接口
2.当用户修改昵称时用户服务调用帖子服务同步接口
3.帖子服务把所有冗余字段更新
该解决方案问题:
性能消耗大,用户修改一次昵称,冗余的数据都得做变动
二、每次获取帖子列表的时候,去请求用户服务获取到该些用户的昵称,插入到列表里。(hash join)
伴随问题
- 增加开发成本,帖子服务需要开获取接口,帖子服务做相应的调用的开发
- 增加处理时间,服务间相互请求的和处理的时间
- 性能消耗,调用两个服务去做同一个工作
三、做个单独的的查询服务
同步各个服务的数据库到一个只读数据库,在查询服务业务里做关联查询。
伴随问题
- 开发成本剧增
- 如果各服务用的数据库不一样,则适配起来很麻烦
- 如果各服务使用分库模式的多组户系统,同步将是地狱
- 各服务业务变动则可能需要查询服务也做出相关变动
四、分服务但不分数据库,由各个服务任意自己做关联查询
伴随问题
- 分服务不分库,属于过渡阶段的做法,后期不可取
- 各个服务使用同一个数据库,数据库压力倍增
五、借用Redis进行数据同步
1.各个微服务连接同一个Redis
2.在用户服务启动时将用户昵称写入到Redis中
3.帖子服务从Redis中按规范读取
4.用户修改昵称时同步数据库内容
伴随问题
- 开发成本增加,需要各个服务统一从Redis中读取数据的格式