在分布式系统中,跨服务和数据库提供统一、可靠的数据访问至关重要,但又极具挑战性。微服务和数据库的拓扑结构为分布、缓存、复制和同步带来了复杂性。
让我们探索有助于解决这些复杂性并简化构建强大、高性能分布式系统的常见数据访问模式。
概述
我们将通过示例介绍以下分布式数据访问模式:
- 每个服务都有数据库
- 共享数据库
- 每个区域的数据库
- CQRS 和事件源
- Saga 模式
- API 组成
- 缓存
- 物化视图
- 复制
- 联邦
- 多语言持久性
- 多数据中心复制
这些模式有助于构建数据库拓扑、有效缓存、同步更改、处理故障和扩展数据访问。
让我们更详细地了解每种模式。
每个服务都有数据库
每个服务数据库模式为每个微服务提供其自己的私有数据库。
例如,订单服务有自己的订单数据库。客户服务有自己的客户数据库。
好处:
- 解耦——服务不依赖于共享模式或数据库
- 所有权——明确所有权,因为每个服务都管理其数据库
- 规模——数据库可以根据服务需求独立扩展
- 简单性——避免数据库共享,使协调更简单
缺点:
- 数据隔离——跨服务交易和查询执行起来更加困难
- 一致性——如果同步不正确,服务之间的数据就会不一致
- 开销——管理多个数据库的运营开销更高
用例:
- 微服务采用的早期阶段
- 不共享数据的简单 CRUD 服务
- 服务团队希望完全控制数据
这种模式提供了一条解耦服务的快速途径,但通常会随着时间的推移而发展,以允许更好的数据共享。
共享数据库
通过共享数据库模式,服务可以共享对单个逻辑数据库的访问权限。
例如,多个服务通过不同的模式访问 Oracle 数据库中的同一个客户表。
好处:
- 简单——避免数据库之间复杂的数据同步和访问
- 一致性——与数据库事务的强一致性
- 已建立— 利用经过验证的 RDBMS 特性,如事务、索引、授权
缺点:
- 紧密耦合