水平扩展的微服务实例是不是应该共享数据库?

Posted

技术标签:

【中文标题】水平扩展的微服务实例是不是应该共享数据库?【英文标题】:Should instances of a horizontally scaled microservice share DB?水平扩展的微服务实例是否应该共享数据库? 【发布时间】:2016-12-25 05:19:32 【问题描述】:

鉴于拥有关系数据库并需要水平扩展的微服务,我看到了两种配置数据库服务器的方法:

为服务的每个实例提供其自己的数据库服务器实例,并具有耦合的流程生命周期

让实例连接到共享的(通过相同服务的相同实例)独立数据库服务器或集群

使用事件驱动架构和前一种方法,微服务的每个实例都需要处理每个事件并采取适当的措施来改变自己的隔离状态。这似乎效率低下。

采用后一种方法,只需一个实例处理事件即可达到相同的效果,但作为共享状态的突变。必须确保每个事件仅由给定微服务的一个实例处理(这很简单吗?)以避免冲突。

这里是否就首选方法达成共识?在这方面,您的经验给了您什么教训?

【问题讨论】:

【参考方案1】:

我会采用第一种方法,即服务本地数据库。每个实例都有自己的数据库实例。这允许在服务的版本之间更改持久层。 否则更改 ER 模型会导致冲突。您还可以使用这种方法轻松更改为 NoSQL 解决方案。

通过事件驱动设计,我可以推荐这本书:Designing Event Driven Systems

如我所见,服务接收到导致事件的请求。该事件被服务的其他实例消费,因此请求不需要再次处理,但结果必须复制到实例状态。

【讨论】:

以上是关于水平扩展的微服务实例是不是应该共享数据库?的主要内容,如果未能解决你的问题,请参考以下文章

微服务实例平台

微服务实例平台

1.5 Go微服务实战(Go语言基础) --- 并发编程

将事件发布到单个微服务实例

Spring 微服务实例未向在 8761 以外的端口中运行的 Eureka 注册

架构微服务实战:从发布到架构——下篇