微服务与共享数据库?使用多个ORM?

Edu*_*ras 34 database architecture orm database-design microservices

我正在学习微服务,我将构建一个带有微服务架构的项目.

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

什么是正确的方法?因为我认为使用一个数据库会涉及很多"黑客攻击"ORM,以使它们正常工作.

Osw*_*ann 55

如果所有服务共享相同的数据库表,则您不太可能从微服务体系结构中受益.这是因为您实际上是紧密耦合服务.如果数据库表发生更改,则所有服务都必须更改.

您必须了解,微服务架构的全部原因是减少开发团队之间的依赖关系,并允许他们通过快速发布独立前进.

以下是亚马逊首席技术官Werner Vogels的报价(亚马逊开创了许多微服务风格架构):

对我们而言,面向服务意味着使用对数据进行操作的业务逻辑封装数据,并且只能通过已发布的服务接口进行访问.不允许从服务外部直接访问数据库,并且服务之间没有数据共享.

欲了解更多信息,请阅读这个这个.

  • 这个答案显然是错误的。即使它们共享相同的数据库,您仍然可以从使用微服务中受益匪浅。不,微服务的全部目的并不是减少您所描述的内容。这只是众多原因之一。我的公司将一个单体应用程序转换为 5 个微服务,它极大地改善了我们的工作流程和应用程序的性能......但它使用单体数据库。 (7认同)
  • 我对 SOA 非常熟悉。我还熟悉这样一个事实:微服务的最初提案并不关心公司的规模,也没有提到共享数据库。就“松散耦合”而言,它只是建议您“根据最适合的”进行选择。您似乎对微服务的定义非常狭窄。 (4认同)
  • @gshauger:很高兴听到您可以从重构中受益。听起来您使用它来更正确地组件化您的应用程序。而且您的应用程序在复杂性、人员规模和水平扩展要求方面可能以不同的规模运行,而不是微服务架构风格的发明场景(Amazon、Netflix、Google 拥有数百个服务等)。当然,由于共享数据库带来的额外依赖关系,较小的场景更容易处理。我建议您阅读 SOA(它存在于微服务术语之前)。 (3认同)
  • 我同意@gshauger 的观点。在某些情况下,您可以通过在单个数据库中为每个服务实现私有表或私有模式来实现服务的数据隐私。当然,在某些情况下,由于吞吐量要求,某些服务也可能必须拥有自己的数据库。但我不认为每个服务器必须有一个数据库...... (2认同)

Pio*_*ski 8

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

实际上,某些服务可能彼此高度相关。例如,CustomerShippingDetails和CustomerShoppingCheckout服务可能都访问相同的数据-客户地址。您将如何解决向客户结帐服务提供客户地址的问题。如果结帐服务直接查询购物明细,那么您将打破服务之间的松散耦合。另一种选择是引入共享数据库。

在架构上总会有某种折衷。值得一提的是在很大程度上取决于全局(整个系统的设计)的体系结构决策。

没有太多有关您的系统的详细信息,我会采用混合方法。也就是说,拥有一个用于处理类似业务逻辑的服务的共享数据库。因此,CustomerShippingDetails和CustomerShoppingCheckout可以共享一个数据库。但是StoreItemsDetails将具有一个单独的数据库。

您可以在Microservice Architecture中找到有关微服务的共享数据库模式的更多信息。

  • 您所指的模式在此处称为反模式:https://microservices.io/patterns/data/database-per-service.html 如果结帐服务使用 API 检索地址,则松散耦合不会被破坏。如果通过模式依赖关系将两者联系起来,松散耦合就会被破坏。 (7认同)