docker - 水平扩展的微服务实例应该共享数据库吗?

标签 docker soa microservices

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

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

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

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

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

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

    最佳答案

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

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

    在我看来,服务收到一个导致事件的请求。此事件由服务的其他实例使用,因此不需要再次处理请求,但必须将结果复制到实例状态。

    关于docker - 水平扩展的微服务实例应该共享数据库吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39015444/

    相关文章:

    web-services - 用于传输对象数据的流式、异步、语言独立技术

    spring - 微服务之间的原子操作

    docker - 使用 X-JFrog-Art-Api 访问 JFrog Artifactory REST API

    cluster-computing - CoreOS 中的共享 IP

    wcf - WCF 中的传输安全和消息安全有什么区别

    java - Spring security permit all 不适用于多个 url

    azure - 基于 REST 的服务在 Azure 中的 Kubernetes 上作为 Pod 运行,且存在间歇性超时

    docker - 无法使用 NodePort 服务从另一个 pod 访问 pod

    Docker Desktop VM 无法从公司网络访问互联网

    c# - 高可用性