事件来源-处理批量交易

时间:2018-09-15 15:48:52

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

我想对我现有的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);
            }
        }

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

在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

在这种情况下,您的总界限在哪里?我认为您有一个单独的“交易”汇总,而不仅仅是“批”汇总,但是从您的情况来看还不清楚。如果您有交易汇总,那么如何导出交易汇总的身份(即聚合密钥)?您只是生成一个Guid吗?

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

通过这种方式,您不必依赖最终一致的投影,并且投影可能会发生变化,因此并不可靠。