Rid*_*ave 3 cqrs event-sourcing microservices
据我了解,当数据库事务跨越微服务时,我们可以通过发布事件来使用消息代理(kafka,RabbitMQ等)来解决此问题,以便订阅者微服务可以通过侦听这些事件来更新其数据库。
如果发生异常,我们可以发送失败事件,以便订阅服务器服务可以更新其状态。
这还不够吗?这种方法有什么问题?
为什么以及何时需要事件来源?
我们真的需要事件源吗?
一点也不。您可以拥有一个非常明确的微服务风格的架构,而无需 CQRS 和事件溯源。CQRS 和事件溯源是微服务内部设计的解决方案。您可以选择使用 CQRS 和事件溯源来实现全部或部分微服务。
让我们看看事件溯源如何帮助您。事件溯源是使用事件而不是像实体框架或 Hibernate 和 SQL 数据库这样的 ORM 来恢复实体当前状态的替代方法。假设您有一个微服务来存储有关 Books 的数据。如果您使用 SQL,您将拥有控制器和端点来创建、更新和删除书籍并将这些书籍存储在 SQL 表中。如果您想更新那本书,那么为了获得当前状态,您将返回 SQL 表并查询该书(通过其 id),然后您的 ORM 将该表表示转换为书对象(对象?关系阻抗不匹配问题),然后您将应用更改并将更改的书籍对象保存回 SQL 表。作为备选,您可以将书籍对象的事件存储在 NoSQL 数据库(如 MongoDB)或事件存储中。现在为了更新这本书,首先你想恢复当前状态,你可以通过取回与这本书相关的所有事件并重放这些事件来恢复当前状态来实现。您的事件成为真相的来源,您完全避免了 ORM 映射和 SQL 连接的瓶颈。事件存储为 JSON 文档并且通常是超快的。
现在,来到 CQRS - CQRS 纯粹是一种关注点分离的模式。您将使用 CQRS 将读取端与写入端分开。与写入端相关的端点(如创建、更新和删除)存在于一个服务中,而读取端的端点存在于另一个服务中。您在这里获得的优势是独立扩展、部署、维护等等。如果您的应用程序是读取密集型的,则为读取端服务部署多个实例。
如果您想了解更多,请随时PM我。祝你好运!
我认为您对微服务感到困惑:)它们是设计可伸缩应用程序的解决方案,与数据库事务无关。更重要的是,数据库事务(理想情况下)不应跨越进程,也不要介意微服务。
pub-sub方法是不同的微服务(也适用于流程模型)如何通信的方式。与数据库事务无关。事件源是将域状态视为相关更改的集合。与微服务相比,目标非常不同。
我们之所以使用ES,是因为我们喜欢将域事件存储为“单一事实来源”(无论是否是微服务)。这都是关于领域模型设计的。
了解有关ES,DDD,CQRS的更多信息,并将微服务留给未来。目前,它们太流行了,很少有应用程序需要它们,很少有开发人员可以实际使用它们。
您将补偿模式描述为分布式事务的替代。在面向微服务的架构中,这是一种利用最终一致性来关注可用性的好方法:每个服务将在没有事务上下文的情况下执行其子任务,而不是跨服务进行集中协调的分布式事务。如果出现问题,每个服务都会收到有关失败的通知,并对之前的操作执行某种(语义)补偿。因此,事务操作最终被撤消。
正如您已经说过的,通信可以通过消息总线系统完成,不需要事件源或 CQRS,补偿模式不依赖于这些原则。