微服务共用Postgres实例分库是否合理?dblink跨库连接是否最优?
问题解答
1. 共用数据库实例、各用独立数据库的合理性
这种做法完全合理,非常适合中小体量、运维资源有限的场景:
- 完全符合微服务的数据隔离原则:两个微服务只能访问自己所属的数据库,数据边界清晰,没有直接耦合
- 运维成本和资源消耗远低于部署多套数据库实例,也足够应对绝大多数非高并发的业务场景
- 后期如果业务规模上涨需要拆分,只要把两个库分别迁移到独立的数据库实例,仅需修改对应服务的数据库连接配置即可,迁移成本极低
- 该逻辑同样适配MySQL等其他支持单实例多独立数据库的关系型数据库
2. 最优数据库连接实现方式
不需要做任何复杂配置,两个微服务各自独立配置对应数据库的连接即可:
- 用户服务的数据库连接配置仅指向
user库,仅拥有该库的读写权限 - 帖子服务的数据库连接配置仅指向
post库,仅拥有该库的读写权限
Postgres/MySQL原生支持单实例下多数据库的独立连接管理,这种方式没有额外性能损耗,是当前场景下的最优方案。
3. dblink的使用建议
完全不推荐使用dblink做跨库连接,原因如下:
- 直接打破微服务的数据边界,两个服务的数据层直接耦合,后续如果要拆分数据库实例、迭代表结构都会受到严重限制
- dblink本身性能表现一般,跨库查询的事务一致性很难处理,容易出现数据异常
你已经通过队列实现了服务间通信,完全可以通过服务接口调用、事件队列同步数据的方式实现跨服务的数据交互,比如帖子服务需要用户信息时调用用户服务的REST接口,或者用户信息变更时通过队列同步冗余字段到帖子服务,都是远优于dblink的实现方案。
内容的提问来源于stack exchange,提问作者iamnonroot
相关产品推荐
相关产品推荐

