使用微服务架构时,底层 read/write 数据库会成为瓶颈吗?
When utilizing a microservices architecture, will the underlying read/write database become a bottleneck?
正如我在问题中所描述的,如果我要实现微服务架构,集中式 read/write 数据库会成为瓶颈吗?
为了举例说明,假设我有三个微服务:users
、teams
和 team_members
。每个都有自己的微服务,但它们在数据库中都相互依赖,因此排他性的并行数据库不合适。由于微服务旨在将工作分发到多个不同的服务器,中央数据库最终是否会破坏这些微服务的目的,因为它们最终都会调用同一台服务器?
...if I were to implement a microservices architecture, would the
centralized read/write database become a bottleneck?
你的问题有一个内置的假设。假设微服务必须共享数据库中的相同主表。
事实上,在你的问题下面,你直接表达了这个概念:
...but they all rely on each other in the database, so exclusive,
parallel databases wouldn't be appropriate.
如果微服务正在共享数据库表,那么您实际上所做的就是构建一个 "service" 具有多个组件的组件,这些组件恰好通过某种带外传输而不是在内存中相互消耗通过直接二进制引用。
面向服务背后最重要的概念之一是autonomy,这基本上意味着每个服务都应该拥有自己的数据。
扩展您的示例,用户服务 将了解团队。它怎么会知道?那么,团队服务 会将团队数据推送到用户服务。同样,team_members 服务 将从两个服务接收数据。现在,所有服务都拥有完成工作所需的所有数据。
因此,通过将您的服务实现为自治的,就可以消除对同一组基表的争用。
是的,这种设计确实破坏了关注点分离,并且在未来当您的微服务增长并且数据库将频繁更改时可能成为瓶颈。(例如,一个微服务数据库所需的更改将需要所有微服务的停机时间三.)
最好为每个微服务拥有单独的数据库实例,并为公共 tables/data.
使用缓存
补充上面的回答...
分解您的领域时,不要使用单一实体交互模型,而是使用 properties/fields 交互和限界上下文来组合您的 components/microservices。
因此,例如,用户帐户注册将只有用户正在修改的字段(更改状态,因此拥有实体的这些属性)。
另一个组件可能有用户的地址,另一个组件有用户的年龄、性别和婚姻信息,另一个组件有他的信用卡和银行详细信息...
您最终会为每个限界上下文创建单独的表。
如何托管表取决于您的负载和基础架构(一个数据库和一台服务器或多台服务器中的所有表 databases/servers)
澄清一下,这些表没有参照完整性,如果你有参照完整性,你会重新引入耦合,这会让你回到数据库争用问题...
观看 this presentation by Udi Dahan 了解更多详情
正如我在问题中所描述的,如果我要实现微服务架构,集中式 read/write 数据库会成为瓶颈吗?
为了举例说明,假设我有三个微服务:users
、teams
和 team_members
。每个都有自己的微服务,但它们在数据库中都相互依赖,因此排他性的并行数据库不合适。由于微服务旨在将工作分发到多个不同的服务器,中央数据库最终是否会破坏这些微服务的目的,因为它们最终都会调用同一台服务器?
...if I were to implement a microservices architecture, would the centralized read/write database become a bottleneck?
你的问题有一个内置的假设。假设微服务必须共享数据库中的相同主表。
事实上,在你的问题下面,你直接表达了这个概念:
...but they all rely on each other in the database, so exclusive, parallel databases wouldn't be appropriate.
如果微服务正在共享数据库表,那么您实际上所做的就是构建一个 "service" 具有多个组件的组件,这些组件恰好通过某种带外传输而不是在内存中相互消耗通过直接二进制引用。
面向服务背后最重要的概念之一是autonomy,这基本上意味着每个服务都应该拥有自己的数据。
扩展您的示例,用户服务 将了解团队。它怎么会知道?那么,团队服务 会将团队数据推送到用户服务。同样,team_members 服务 将从两个服务接收数据。现在,所有服务都拥有完成工作所需的所有数据。
因此,通过将您的服务实现为自治的,就可以消除对同一组基表的争用。
是的,这种设计确实破坏了关注点分离,并且在未来当您的微服务增长并且数据库将频繁更改时可能成为瓶颈。(例如,一个微服务数据库所需的更改将需要所有微服务的停机时间三.)
最好为每个微服务拥有单独的数据库实例,并为公共 tables/data.
使用缓存补充上面的回答...
分解您的领域时,不要使用单一实体交互模型,而是使用 properties/fields 交互和限界上下文来组合您的 components/microservices。
因此,例如,用户帐户注册将只有用户正在修改的字段(更改状态,因此拥有实体的这些属性)。
另一个组件可能有用户的地址,另一个组件有用户的年龄、性别和婚姻信息,另一个组件有他的信用卡和银行详细信息...
您最终会为每个限界上下文创建单独的表。
如何托管表取决于您的负载和基础架构(一个数据库和一台服务器或多台服务器中的所有表 databases/servers)
澄清一下,这些表没有参照完整性,如果你有参照完整性,你会重新引入耦合,这会让你回到数据库争用问题...
观看 this presentation by Udi Dahan 了解更多详情