在信用交易系统上实施事件采购



当前我们有一个系统来处理信用的信用和借方。

它将每个操作作为交易事件存储在数据库中,但总的来说,我们仍然更新一个" Credit_Bank"表,该表代表用户的当前余额。

          Table "public.credit_bank"
     Column     |          Type          | Modifiers 
----------------+------------------------+-----------
 id             | bigint                 | not null
 user_id        | bigint                 | 
 currency       | character varying(255) | 
 amount         | numeric(40,10)         | not null

                 Table "public.transaction"
      Column      |            Type             | Modifiers 
------------------+-----------------------------+-----------
 id               | bigint                      | not null
 amount           | numeric(40,10)              | not null
 credit_bank_id   | bigint                      | 
 status           | character varying(255)      | not null
 transaction_date | timestamp without time zone | 
 type             | character varying(255)      | not null

由于我们一次一次处理大量交易,因此每次更新以避免过时的问题时,我们都被迫锁定信用表。

然后我遇到了事件采购。在这种情况下,这种模式适用吗?

我真的是新手,所以请让我知道我是否有问题。

在我理解的情况下,如果我们使用事件采购,我们不需要存储" Credit_Bank"的状态,而是使用事件来提出状态或使用快照。但是如何确保当前的平衡仍然足够。

另外,如果我们每次通过处理事件来获得状态,这对性能不利吗?

在这种情况下,这种模式适用吗?

这听起来像是我试图描述某些角案例时使用的一个例子,所以我认为。

在我理解的情况下,如果我们使用事件采购,我们不需要存储" Credit_Bank"的状态,而是使用事件来提出状态或使用快照。但是如何确保当前的平衡仍然足够。

这些交易来自您的业务模式,还是这些交易是由世界各地的银行向您报告的东西。因为如果是后者,那么您需要考虑一下"当前"余额的含义 - 您正在查询现在,在远程银行向您发送交易后,但是在此交易获取之前记录在您的数据库中。余额仍然"当前"?

随着来自"其他地方"的信息,我们通常不会对时间做出原始的假设。因此,不是,"当前余额",而是"时间= t"。或"时间= t1的余额,最新可用的更新为time = t2"

换句话说,您开始包括时间建模,并与企业讨论可用的延迟是否"足够好",使该延迟较短的成本是多少,成本是多少>使延迟较短,依此类推。

如果我们每次通过处理事件来获得状态,这对性能不利吗?

可能是。通常,事件采购与CQR相结合;这是另一种延迟权衡 - 更新模型的责任与查询模型的责任分开,并有一点管道将新数据从更新模型复制到查询模型。

由于我们一次一次处理大量交易,因此每次更新以避免过时的问题时,我们都被迫锁定信用表。

您可能需要使用数据库交易(我不是指财务交易),以使两张表保持一致。这损害了性能和可伸缩性。

然后我遇到了事件采购。在这种情况下,这种模式适用吗?

事件采购非常适合仅附录系统,所以是的。

在我理解的情况下,如果我们使用事件采购,我们不需要存储" Credit_Bank"的状态,而是使用事件来提出状态或使用快照。但是如何确保当前的平衡仍然足够。

在每个withdrawMoneyFromTheAccount命令之前,您都可以重播该帐户上的所有财务交易并计算当前余额;然后,您将交易金额与该余额进行比较并允许或拒绝交易。

另外,如果我们每次通过处理事件来获得状态,这对性能是否不利?

用于锁定,而不是使用悲观的锁定(如交易),您应该使用version列使用乐观的锁定。获得了有关性能的真正好处,因为使用事件采购,您只需要保护一个表,事件存储,而不是必须同步的两个,就像您当前的体系结构一样。

最新更新