我想了解微服务的数据库设计。下面给出了场景
微服务A使用mysql数据库。如果我要创建微服务 A 的多个实例:
每个微服务A应该指向同一个数据库(所有实例的公共数据库)或
每个微服务A都指向自己的私有数据库
如果每个微服务实例都指向自己的私有数据库如何同步每个实例的数据?你能解释一下最好的方法吗?
我正在创建微服务 A 的多个实例:
我认为您的意思是,如果您将微服务 A 的多个实例作为该微服务的单独实例部署到一台或多台服务器上?
简短回答:
一般来说,每个微服务都应该有一个数据库。这意味着你的微服务A有一个数据库(我们称之为)微服务-A_db。
无论您的微服务-A 部署到多台服务器(水平扩展)还是部署在一台服务器上,微服务-A 的部署实例都会访问和使用您的一个数据库微服务-A_db。
微服务 A 的所有实例都应访问同一数据库。这是标准且最常见的用例。但也有例外。
长答案:
每个微服务A应该指向同一个数据库(公共数据库
对于所有实例)或
简而言之,是的。
每个微服务A都指向自己的私有数据库
简而言之,没有。但...
如上所述,如果您的意思是微服务 A 的多个实例应该将每个实例都指向私有数据库,那么“否”。你不应该那样做。
一般来说,您的应用程序域/业务逻辑根据某些标准分为微服务。一旦您将系统拆分为每个域的多个微服务(您可以阅读它here https://stackoverflow.com/questions/56509701/how-small-a-micro-service-should-be/56668521#56668521)每个微服务只负责域的那部分,意味着与其及其存储相关的所有逻辑。让我举个例子。假设您有一个在线商店应用程序并且有 3 个微服务:
每个微服务都有自己的数据库:
- 产品库存微服务 具有库存微服务数据库
- 支付微服务有支付微服务数据库
- 订单微服务有订单微服务数据库
这些数据库只能由他们使用owner微服务。如果微服务作为单独的进程/实例部署在一台或多台服务器上,那并不重要。他们都访问同一个数据库。另一方面,您肯定可以使用许多不同类型的微服务数据库部署,例如拥有多个只读副本、使用分片来分区数据等等。有很多方法可以扩展数据库。关键是微服务只能使用自己的数据库。
除此之外,我可以说这个规则也有例外:1 个数据库 - 1 个微服务。有时人们每个微服务域使用 2 个数据库。在这些示例中,第二个数据库是针对特定读取/查询操作的某种读取优化数据库。这通常与 CQRS 模式一起使用。如果您想了解更多信息,您可以在 Stack Overflow 上以及一般网络上阅读大量有关 CQRS 的内容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)