如何通过最终一致性来处理并发?或者我可以问如何通过最终一致性来确保数据完整性?
通过 CQRS 和事件溯源,最终一致性意味着您将域事件放入队列中,并设置作为投影的事件处理程序。这些预测以异步方式更新读取缓存。现在,如果您使用该读取缓存进行验证,则无法确定验证所依据的信息是否仍然有效。当您发送命令时,队列中可能存在未处理(或未投影?)的域事件,这可能会改变验证的结果。所以这只是另一种并发......你怎么看,如何处理这些罕见的并发问题?域事件已经保存在存储中,所以你不能对它们做任何事情,你不能只是从事件存储中删除它们(因为它应该只写一次),并在电子邮件中告诉用户,对不起,我们下定决心取消了您的请求。或者你可以吗?
更新:
通过事件存储处理并发的可能解决方案:
通过写模型
if
last-known-aggregate-version < stored-aggregate-version
then
throw error
else
execute command on aggregate
raise domain-event
store domain-event
++stored-aggregate-version (by aggregate-id)
按阅读模型
process query
if
result contains aggregate-id
then
attach read-cached-aggregate-version
通过投影
process domain-event
read-cached-aggregate-version = domain-event-related-aggregate-version (by aggregate-id)