如何处理微服务中的数据库故障?
How to handle Database failures in Microservices?
我有 3 个微服务,例如 A、B、C。服务 A 执行一些任务并相应地更新其数据库。其余两项服务相同。
假设服务 C 由于某些错误无法插入数据库,但服务 A 和 B 相应地更新了数据库,这导致了数据库中的不一致。
如果-
我该如何正确处理这种情况
- 我有一个用于所有服务的通用数据库吗?
- 与每个服务关联的独立数据库?
感谢您的回答!
您可以使用RabbitMQ在微服务之间进行消息交互。 RabbitMQ 将保存有关数据库更新的所有信息。因此,即使微服务在数据库更新之前死亡,当微服务再次启动时,它也会查看 RabbitMQ 并知道它遗漏了什么。因此它可以在从故障中恢复后进行数据库更新。
对于单独的数据库,您可能需要 google SAGA 架构模式。这有助于您管理跨不同微服务的事务,每个微服务都有各自的数据库。在这里描述它会花费我很多space,所以我认为我能给你的最好建议是让你参考这篇文章SAGA Pattern for database per service architecture
首先,在微服务架构中,您应该追求独立的数据库,或者至少是独立的模式。正如评论中指出的那样,跨微服务共享数据将是一种微服务反模式。
您可以在这里考虑几种方法:
每个微服务都会更新自己的数据库并通知其他微服务已发生更新。这使每个微服务能够对齐自己的数据库(最终一致)。
如果需要协调,更好的方法是创建第四个协调微服务,其工作是协调其他三个微服务。研究传奇模式。如果您需要事务协调(即所有服务必须更新其数据库或 none 个数据库),这将特别有用。如果您认为您需要事务协调,请仔细考虑 - 在许多(大多数?)情况下,最终一致就足够了。如果你真的需要交易,那么你应该研究 saga 和 routing slip 模式,其中包括在发生故障时的补偿。
如果您需要三个独立数据库的统一视图,请考虑另一个微服务,其工作是创建您需要的视图(投影)。让微服务做他们擅长的一件事,而且只有当你开始在你的微服务中混合关注点时——好吧,这又是一种反模式。
启用微服务通信的一个好方法是使用消息总线,例如 RabbitMQ 或 Azure 服务总线,但还有许多其他选项,包括 Spring Boot。
考虑到你的问题,在开始微服务项目之前,我会花更多时间研究微服务架构和适合你的项目的工具。已经做了很多工作来减轻微服务的复杂性,你最好研究最适合你的工具集。尽管如此,一开始它会增加相当多的复杂性,但如果随着项目的发展做得好,它会带来回报。
我有 3 个微服务,例如 A、B、C。服务 A 执行一些任务并相应地更新其数据库。其余两项服务相同。
假设服务 C 由于某些错误无法插入数据库,但服务 A 和 B 相应地更新了数据库,这导致了数据库中的不一致。
如果-
我该如何正确处理这种情况- 我有一个用于所有服务的通用数据库吗?
- 与每个服务关联的独立数据库?
感谢您的回答!
您可以使用RabbitMQ在微服务之间进行消息交互。 RabbitMQ 将保存有关数据库更新的所有信息。因此,即使微服务在数据库更新之前死亡,当微服务再次启动时,它也会查看 RabbitMQ 并知道它遗漏了什么。因此它可以在从故障中恢复后进行数据库更新。
对于单独的数据库,您可能需要 google SAGA 架构模式。这有助于您管理跨不同微服务的事务,每个微服务都有各自的数据库。在这里描述它会花费我很多space,所以我认为我能给你的最好建议是让你参考这篇文章SAGA Pattern for database per service architecture
首先,在微服务架构中,您应该追求独立的数据库,或者至少是独立的模式。正如评论中指出的那样,跨微服务共享数据将是一种微服务反模式。
您可以在这里考虑几种方法:
每个微服务都会更新自己的数据库并通知其他微服务已发生更新。这使每个微服务能够对齐自己的数据库(最终一致)。
如果需要协调,更好的方法是创建第四个协调微服务,其工作是协调其他三个微服务。研究传奇模式。如果您需要事务协调(即所有服务必须更新其数据库或 none 个数据库),这将特别有用。如果您认为您需要事务协调,请仔细考虑 - 在许多(大多数?)情况下,最终一致就足够了。如果你真的需要交易,那么你应该研究 saga 和 routing slip 模式,其中包括在发生故障时的补偿。
如果您需要三个独立数据库的统一视图,请考虑另一个微服务,其工作是创建您需要的视图(投影)。让微服务做他们擅长的一件事,而且只有当你开始在你的微服务中混合关注点时——好吧,这又是一种反模式。
启用微服务通信的一个好方法是使用消息总线,例如 RabbitMQ 或 Azure 服务总线,但还有许多其他选项,包括 Spring Boot。
考虑到你的问题,在开始微服务项目之前,我会花更多时间研究微服务架构和适合你的项目的工具。已经做了很多工作来减轻微服务的复杂性,你最好研究最适合你的工具集。尽管如此,一开始它会增加相当多的复杂性,但如果随着项目的发展做得好,它会带来回报。