当前我们有一个系统来处理信用的信用和借方。
它将每个操作作为交易事件存储在数据库中,但总的来说,我们仍然更新一个" 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
列使用乐观的锁定。获得了有关性能的真正好处,因为使用事件采购,您只需要保护一个表,事件存储,而不是必须同步的两个,就像您当前的体系结构一样。