在微服务中,多个服务可能查询同一个 MySQL 的表,比如用户表等,这时需要考虑解耦和性能问题。
问题
- 多个服务同时使用同一个公共表,一旦其中一个服务的查询语句索引失效,就会引发全表搜索,导致其他服务也被阻塞
方案
- 方案 1
- 将公共表下沉为基础服务(关联公共表数据库),业务模块上浮为业务服务(关联业务自己的独立数据库),业务应用通过 RPC/RestfulAPI 间接访问公共表
- 优点:
- 某个服务阻塞不会影响其他服务
- 缺点:
- 开发繁琐,连表查询需要用逻辑实现,容易犯错
- 方案 2
- 用注册发现机制,将服务可以提供的 url 注册到注册中心,由调用者发现、关联
- 利用 java 注解实现数据字段的关联和自动查询;在 golang 中可以用 tag 和反射实现
- 优点:
- 通过框架屏蔽了复杂性
- 缺点:
- 限于数据量较小的情况,如果量太大需要专门的批量查询优化