如何通过最终一致性处理并发?

时间:2014-05-24 08:06:27

标签: concurrency domain-driven-design cqrs event-sourcing eventual-consistency

如何通过最终一致性处理并发?或者我可以问一下如何通过最终的一致性来确保数据的完整性?

通过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)

1 个答案:

答案 0 :(得分:1)

只要状态发生变化,你就不能假设任何事情都会100%一致。从技术上讲,您可以确保各种位与您知道的 100%一致

您的排队域事件方案与用户桌面上仍需要输入系统的工作队列没有区别。

执行依赖于系统状态的操作的任何其他用户无法知道另一个用户仍然需要执行可能干扰其操作的某些操作。

我想很多是基于假设数据是一致的,并开发可以处理这些场景的备用流程和流程。