微服务数据库设计

时间:2019-12-17 07:01:07

标签: microservices

我想了解微服务的数据库设计。情况如下所示

微服务A正在使用mysql数据库。如果我要创建微服务A的多个实例:

  1. 每个微服务A应该指向同一个数据库(所有实例的公共数据库)或

  2. 每个微服务A都指向其自己的私有数据库

如果每个微服务实例都指向其自己的私有数据库,那么如何同步每个实例的数据?你能解释一下最好的方法吗?

1 个答案:

答案 0 :(得分:2)

  

我正在创建微服务A的多个实例:

我假设您的意思是,如果要将微服务A的多个实例作为该微服务的单独实例部署到一个或多个服务器上?

简短答案:

通常,每个微服务都应具有一个数据库。这意味着您的微服务A具有一个数据库(叫它)micro-service-A_db。 无论您将微服务A部署到多台服务器(水平扩展)还是在1台服务器上,您的微服务A的部署实例都将访问并使用一个数据库微服务A_db。
您的微服务A的所有实例都应访问同一数据库。这是标准且最常见的用例。对此有例外。

长答案:

  

每个微服务A应该指向同一个数据库(通用数据库)   对于所有实例)或

总之是。

  

每个微服务A都指向其自己的私有数据库

简而言之。但是...

如上所述,如果您的意思是微服务A的多个实例应分别指向私有数据库,则为否。你不应该那样做。

通常,您的应用程序域/业务逻辑会根据某些条件分为微服务。在将每个域的系统拆分为多个微服务后(您可以阅读here),每个微服务仅负责Domain的那部分,即与之有关的所有逻辑及其存储。让我举个例子吧。假设您有一个在线商店应用程序,并且有3个微服务:

  • 产品库存微服务
  • 支付微服务
  • 订单微服务

每个微服务都有自己的数据库:

  • 产品库存微服务具有库存微服务数据库
  • 支付微服务有支付微服务数据库
  • 订单-微服务有订单-微服务-数据库

这些数据库只能由其所有者微服务使用。如果将微服务作为单独的进程/实例部署在一个或多个服务器上,则没有关系。他们所有人都访问同一个数据库。另一方面,您可以肯定地使用多种不同类型的微服务数据库部署,例如具有多个只读副本,使用分片对数据进行分区等等。有很多扩展数据库的方法。关键是微服务只能使用自己的数据库。

除此之外,我可以说该规则有例外:1个数据库-1个微服务。有时,每个微服务域使用2个数据库。这些示例中,第二个db是针对特定读取/查询操作的某种读取优化的db。这通常与CQRS模式一起使用。如果您想进一步了解它,可以在Stack Overflow以及一般在网络上阅读有关CQRS的更多信息。

相关问题