首页 > 解决方案 > lagom 如何识别哪些事件是针对哪个实体的

问题描述

根据概念上关于 Lagom 的讨论之一,我在此链接中阅读

实体不会在任何地方持久化 - 这是事件源的重点,您只需存储事件,这可以非常简单地实现,易于分发,并且由于它只是一个附加操作而以非常高的性能完成。当需要加载实体时,将加载该实体的事件,然后您声明用于处理事件的事件处理程序处理每个事件以生成当前实体状态。

我的问题是 lagom 如何识别哪些事件属于哪个实体。举个例子:我有一个为用户执行 CRUD 操作的休息服务。对于事件溯源,我创建了一个 UserEntity 类,我在其中为 CUD 操作定义了不同的命令处理程序。现在,对于我来说,当应用程序运行时,lagom 会生成一个 UserEntity 类的实例。现在,如果我为“Alice”发起创建请求并为“Bob”创建请求,然后为“Alice”创建更新请求,这里有两个实体,Alice 和 Bob。那么 lagom 如何识别实体“Alice”,创建和更新了两个事件,而对于 Bob,只创建了一个事件。它如何将事件绑定到实体?

标签: cqrsevent-sourcinglagom

解决方案


对您的描述的误解是 lagom 没有创建UserEntity。正确的句子是:“Lagom 为我系统中的每个用户创建一个 UserEntity 实例”。

诀窍是,无论何时您想向持久实体实例发送事件,都必须按类型和 ID 请求实例:

PersistentEntityRegistry persistentEntities = ...;
PersistentEntityRef<UserCommand> refAlice = 
  persistentEntities.refFor(UserEntity.class, "Alice");

在上面的代码片段中,Lagom 保证您发送到的所有命令refAlice将仅由该实例处理。

然后,由 发出的任何事件refAlice都将绑定到类和 ID,因此它们不能与其他实例发出的事件混淆。


推荐阅读