Php 如何在事件驱动架构中处理事务?

Php 如何在事件驱动架构中处理事务?,php,domain-driven-design,cqrs,event-driven,Php,Domain Driven Design,Cqrs,Event Driven,我目前正在使用DDD和CQRS,并且我向前移动了一个遗留应用程序 假设我有一个文章实体,我可以在上面投票 当对一个项目进行投票时,我想根据投票的价值相应地增加或减少一个计数器 这个计数器是我的查询模型的一部分,因此我认为它不适合域模型,出于这样的原因,我决定编写一个CastArticleVoteService,在其中我将关于投票的业务逻辑放入其中,并发送一个事件,由自定义事件处理程序处理,该事件处理程序反过来更新数据库中的计数器 首先,我对此表示怀疑,因为我告诉自己“嘿,更新计数器的过程应该与保

我目前正在使用DDD和CQRS,并且我向前移动了一个遗留应用程序

假设我有一个文章实体,我可以在上面投票

当对一个项目进行投票时,我想根据投票的价值相应地增加或减少一个计数器

这个计数器是我的查询模型的一部分,因此我认为它不适合域模型,出于这样的原因,我决定编写一个CastArticleVoteService,在其中我将关于投票的业务逻辑放入其中,并发送一个事件,由自定义事件处理程序处理,该事件处理程序反过来更新数据库中的计数器

首先,我对此表示怀疑,因为我告诉自己“嘿,更新计数器的过程应该与保存数据的过程在同一个事务中”。但是,如果我有polyglot持久性(即:MySQL/Redis),这显然是错误的

但是,事务仍然适用,我如何确保整个事件处理程序都得到了正确处理,并且我的数据是一致的?(这是我的柜台)。(异步事件处理程序呢?)


任何提示?

集合定义事务边界。当您决定采用事件驱动体系结构时,您就决定了最终的一致性。因此,您只需选择:事务或事件


注意,在大多数情况下,最终的一致性对业务来说是完全好的。这是唯一一个在大学里通过RDBMS讲座/洗脑植入交易崇拜的开发者;)

聚合定义事务边界。当您决定采用事件驱动体系结构时,您就决定了最终的一致性。因此,您只需选择:事务或事件


注意,在大多数情况下,最终的一致性对业务来说是完全好的。这是唯一一个在大学里通过RDBMS讲座/洗脑植入交易崇拜的开发者;)

好吧,以下是我对你的问题的看法:

事件驱动
CRQ
体系结构中,它也常用作模式

这意味着您的投票将不会存储为计数器(
状态
),而是存储为向上/向下投票(
事实

在您的场景中,要查询一篇文章累积了多少选票,您可以读取与聚合相关的所有事件,并按照事件发生的顺序逐个(在内存中)应用它们,并获得聚合实例的最终状态(
文章

有时,当事件量很大时,会对将这些事件应用到聚合中所产生的最新事实保留快照

值得注意:将事件应用于 获取状态。因为如果一个投票支持/反对事件导致一篇文章 例如,关闭并向作者发送了一封电子邮件,那么您就不需要了 希望在重播这些事件时再次发送该电子邮件

将其视为银行借贷事件的金融等价物。银行不仅仅储存你的余额。它们实际上存储您的所有交易,然后进行对账并更新您的余额

如果债务人/债权人账户在同一家银行内,某些交易会立即发生

这会给你带来什么?
  • 可扩展性;这是一个写优化的体系结构,可以处理更大的请求以更快地修改应用程序状态,而无需事务和锁定
  • 可追溯性;在检查系统时,您不仅会发现您的位置(当前状态),而且会知道您是如何/为什么到达那里的(事件)
此外,由于您有一个包含所有用户与系统交互的数据流,因此您可以在以后以不同的方式将该数据用于新功能,而这些新功能是您从设计系统之初就不会想到的(例如,分析?)

进一步阅读:


好的,下面是我对你的问题的看法:

事件驱动
CRQ
体系结构中,它也常用作模式

这意味着您的投票将不会存储为计数器(
状态
),而是存储为向上/向下投票(
事实

在您的场景中,要查询一篇文章累积了多少选票,您可以读取与聚合相关的所有事件,并按照事件发生的顺序逐个(在内存中)应用它们,并获得聚合实例的最终状态(
文章

有时,当事件量很大时,会对将这些事件应用到聚合中所产生的最新事实保留快照

值得注意:将事件应用于 获取状态。因为如果一个投票支持/反对事件导致一篇文章 例如,关闭并向作者发送了一封电子邮件,那么您就不需要了 希望在重播这些事件时再次发送该电子邮件

将其视为银行借贷事件的金融等价物。银行不仅仅储存你的余额。它们实际上存储您的所有交易,然后进行对账并更新您的余额

如果债务人/债权人账户在同一家银行内,某些交易会立即发生

这会给你带来什么?
  • 可扩展性;这是一个写优化的体系结构,可以处理更大的请求以更快地修改应用程序状态,而无需事务和锁定
  • 可追溯性;在检查系统时,您不仅会发现您的位置(当前状态),而且会知道您是如何/为什么到达那里的(事件)
此外,由于您有一个包含所有用户与系统交互的数据流,因此您可以在以后以不同的方式将该数据用于新功能,而这些新功能是您从设计系统之初就不会想到的(例如,分析?)

进一步阅读:

  • <