Database 使用共享数据库的微服务?使用多个ORM';s

Database 使用共享数据库的微服务?使用多个ORM';s,database,database-design,orm,architecture,microservices,Database,Database Design,Orm,Architecture,Microservices,我正在学习微服务,我将构建一个具有微服务体系结构的项目 问题是,我的一个团队成员希望为所有服务使用一个数据库,共享所有表,以便“数据不会重复”,每个服务都将使用不同的框架和语言构建,如django和rails,它们使用非常不同的ORM标准 正确的方法是什么?因为我认为使用一个数据库需要对ORM进行大量的“黑客”操作,以使其正常工作。如果所有服务共享相同的数据库表,则不太可能从Microservices体系结构中获益。这是因为您有效地将服务紧密耦合。如果数据库表发生更改,则所有服务都必须更改 您必

我正在学习微服务,我将构建一个具有微服务体系结构的项目

问题是,我的一个团队成员希望为所有服务使用一个数据库,共享所有表,以便“数据不会重复”,每个服务都将使用不同的框架和语言构建,如django和rails,它们使用非常不同的ORM标准


正确的方法是什么?因为我认为使用一个数据库需要对ORM进行大量的“黑客”操作,以使其正常工作。

如果所有服务共享相同的数据库表,则不太可能从Microservices体系结构中获益。这是因为您有效地将服务紧密耦合。如果数据库表发生更改,则所有服务都必须更改

您必须理解,微服务体系结构的全部原因是减少开发团队之间的依赖性,并允许他们独立地进行快速发布

以下是亚马逊首席技术官沃纳·沃格尔(Werner Vogels)的一段话(亚马逊开创了许多微服务风格的架构):

对于我们来说,面向服务意味着用 对数据进行操作的业务逻辑,只有通过 已发布的服务接口。不允许直接访问数据库 来自服务外部,并且服务之间没有数据共享 服务

有关更多信息,请阅读和

2021年的更新:

一些评论者指出,共享一个物理数据库可能没问题,例如,通过在同一个数据库中为不同的服务使用单独的表或模式。这当然是可能的,并且仍然是服务开发关注点的有用分离。如果您希望服务团队负责整个服务堆栈和部署(包括基础设施),或者如果您希望将其划分为基础设施或devops团队,那么这是一个架构(以及组织)决策。每种方法都有其优缺点,具体取决于您的组织环境、规模、需求等


另一个方面是更新的、可扩展的数据库技术变得越来越流行。它们通常抽象存储和计算以实现单独的可伸缩性,并作为服务使用(例如Snowflake、Teradata、BigQuery等)。它们允许使用单个集群扩展到非常大的规模,拥有数百万个表和PB级的内容。有了这些,microservice实现团队就不必担心运行DB基础设施的细节,而只需将DB集群端点用作服务依赖项。通常情况下,许多服务都依赖于同一个DB集群。但是,您仍然需要注意存储分离,例如,分离的逻辑表、集合或在特定数据库技术中有意义的任何内容。

通常,微服务应该负责自己的数据。这是一个完美的世界场景

在实践中,一些服务可能彼此高度相关。例如,CustomerShippingDetails和CustomerShoppingCheckout服务都可以访问相同的数据-客户地址。然后,您将如何解决向客户结账服务提供客户地址的问题。如果结帐服务直接查询购物详细信息,那么就打破了服务之间的松散耦合。另一个选择是引入共享数据库

在架构上总会有某种妥协。神圣的是一个高度依赖于全局(整个系统的设计)的架构决策

没有太多关于你的系统的细节,我会采取混合的方法。也就是说,为负责类似业务逻辑的服务提供共享数据库。因此CustomerShippingDetails和CustomerShoppingCheckout可以共享一个数据库。但是StoreItemsDetails将有一个单独的数据库


有关微服务共享数据库模式的更多信息,请访问。

为什么需要“破解”ORM?仅仅因为它们有不同的语法并不意味着它们最终基本上没有做相同的事情,查询数据库。可能重复的是您有一个客户端详细信息服务?取决于此服务将负责什么。如果它处理个人的详细信息-请确定。如果它处理的是人的详细信息加上购物详细信息加上运输等,那么我会将其分解,使微服务的范围限制在非常精确的领域内,以便在需要时很容易替换。您所指的模式在这里被称为反模式:如果结帐服务检索,松散耦合不会被打破使用API的地址。如果通过模式依赖关系将两者联系起来,松散耦合将被打破。让一个专用的微服务与数据库通信,让所有其他微服务调用该服务如何?最大的优势之一是,将来如果我们迁移到另一个数据库(比如从SQL迁移到Mongo),那么我们只需更新该服务,其他服务都不需要知道。这个答案显然是错误的。即使微服务共享同一个数据库,您仍然可以从中受益匪浅。不,微服务的全部目的不是减少你所描述的内容。这只是众多原因之一。我的公司将一个单片应用程序转换为5个微服务,极大地改进了我们的工作流程和应用程序的性能……但它使用单片数据库。@gshauger:很高兴听到您能从重构中受益。听起来您使用它来更正确地组件化应用程序。您的应用程序在复杂性、人员规模和水平扩展需求方面的运行规模可能与微服务体系结构风格所针对的场景(Amazon、Netflix)不同