如何使用 Lagom 设置域模型?

How to setup a domain model with Lagom?

我目前正在尝试构建一个处理个人财务的应用程序。我正在为 Lagom 的做事方式苦苦挣扎,因为我找不到任何使用 Lagom 构建的 "real" 应用程序的示例。我不得不猜测什么是最佳实践,我总是害怕掉入陷阱。

我的情况如下:我有 UsersAccountsTransactions。帐户属于用户,但它们之间可以 "shared"(使用某种授权系统,一个用户是管理员,其他用户可以读取或编辑该帐户)。交易有一个可选的 "debit" 帐户,一个可选的 "credit" 帐户和一个始终为正的金额。

我考虑的场景如下:

  1. 我认为交易属于账户,并且作为条目列表是账户实体的一部分。在这种情况下,transfert 交易必须在另一个帐户中有一个 "sister" 条目。这似乎很容易实现,但我担心:
    • 实体(和快照)的潜在大小。如果我的账户包含成千上万笔交易会怎样?
    • 多个账户重复交易
  2. 我认为交易有自己的服务。在这种情况下,我可以使用 Kafka 在记录交易时发布事件,这样帐户实体就可以 "update" 保持平衡。在那种情况下,在实体中设置 "balance" 属性 或更新读取数据库的事务事件的读取端事件侦听器有意义吗?
  3. 我可以在同一个服务中有两个持久实体,但在那种情况下,我在读取端遇到了困难。假设我有一个交易,我想插入 "transactions" table 并更新 "accounts" table。我是否应该有多个读取端处理器来侦听不同的事件但写入同一个数据库?

你怎么看?

我认为你不应该有一个不同的实体'Transactions',因为它与账户实体紧密耦合,事实上,一个账户的交易只不过是这个账户的事件日志。所以我建议在转账交易时用唯一的交易id和对方账户的id来持久化余额,让读处理器监听账户变化的事件存储在读模型中。

这样做,转账只是两个帐户之间的一条消息,它会导致余额的修改,稍后将作为每个帐户的事件日志的一部分持久存在。这种方式似乎更自然,您不必管理单独的聚合根,此外,它与帐户实体紧密耦合。