【问题标题】:event sourcing - handle batch transactions事件溯源 - 处理批量事务
【发布时间】:2019-02-20 02:41:32
【问题描述】:

我想对我拥有的现有 Web 应用程序实施事件溯源。我的实现是一个 .NET Core WEB API,但这无关紧要。该网络应用将包含银行账户交易(类似于从您的银行账户导出)的 CSV 文件导入到 API。

API 获取所有事务,对其进行验证,并删除之前导入的任何事务,然后将它们存储到事务表中。然后根据这些数据生成报告,例如,上个月购买的天然气总量、2017 年外出就餐的总支出等。

在我看来,这种类型的应用程序非常适合事件溯源(反之亦然),但我很难理解如何实现它。我正在尝试实现类似this simple example 的东西。它有一个包含交易事件的帐户聚合,类似于我想做的。

我的第一个问题是,我该如何处理批量交易,因为有些可能是重复的,所以并不是所有的交易都被保存了? This question 确实涉及该主题,但不同之处在于,在某些情况下,由于文件可能相同,因此在重复检查后可能不会保存任何交易,或者自上次导入以来没有新交易。

其次,如何检查交易是否重复?目前,我的重复检查如下所示:

        var all = await _transactionRepository.GetAll(-1);
        var lookup = all.ToLookup(x => Tuple.Create(x.PostingDate, x.Description, x.Amount, x.Balance));

        foreach (var o in original)
        {
            o.Created = DateTime.Now;

            if (!lookup.Contains(Tuple.Create(o.PostingDate, o.Description, o.Amount, o.Balance)))
            {
                // does not currently exist in the db so add to clean list
                final.Add(o);
            }
        }

我会创建一个投影来寻找那个特定的事件吗?我无法理解如何检查现有数据。

在此先感谢您对理解这一点的任何帮助。

【问题讨论】:

  • “我会创建一个投影,寻找那个特定的事件吗?”——让你的逻辑依赖于一个投影的状态是破坏你的事件源的好方法。更多乐趣可以在leanpub.com/esversioning找到
  • 这就是我对投影的理解。这种想法有什么问题?
  • 当需求发生变化时(例如,判断事务是否重复的方式),相关的预测也会发生变化,这几乎肯定会导致无法以相同的结果重播事件

标签: c# .net-core projection event-sourcing


【解决方案1】:

在这种情况下,您的聚合边界在哪里?我认为您有一个单独的 Transaction 聚合,而不仅仅是一个 Batch 聚合,但从您的情况来看并不清楚。如果你确实有一个交易聚合,你如何获得交易聚合的身份(即聚合密钥)?你只是生成一个Guid吗?

您有一个表示交易唯一 ID 的元组。根据这些值,您应该能够创建一个唯一且可重现的 ID,也许是一个哈希。当您向该事务 ID 发出“创建”命令时,如果事务已经存在,则操作应该是幂等的,因此不应该执行任何操作。为了防止可能的重复 ID,您还可以在聚合中检查详细信息(例如 PostingDate、Description、Amount...)是否与 Create 命令中的匹配。如果他们这样做,则忽略该命令。如果没有,则发出“CreateFailed”事件以指示生成了重复 ID。您可以在 Saga 中侦听该事件,然后生成一个新的但仍可重现的 ID 并向其发出 Create 命令。

这样,您就不会依赖于最终一致的预测,并且会发生变化,因此不可靠。

【讨论】:

  • 抱歉搁置了很长时间,然后重新开始。我有一个帐户聚合,类似于我上面链接的示例。我想以与示例相同的方式处理它,即单独处理每个事务,即使它是分批出现的。它似乎是事件溯源的理想选择。我没有考虑过 Transaction 是一个聚合,因为它感觉更像是一个事件。
  • 我也看不出我是如何依赖我的问题的预测的。我从您的评论中得知:“通过这种方式,您不依赖于最终一致的预测......”
猜你喜欢
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
  • 2023-03-24
  • 2016-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多