【问题标题】:Particular NServiceBus Sagas: Concurrent Access to Saga Data Persisted in Azure Table Storage特定的 NServiceBus Sagas:并发访问 Azure 表存储中持久的 Saga 数据
【发布时间】:2015-02-12 22:36:00
【问题描述】:

这个问题是关于并发访问 saga 数据的,当 saga 数据持久保存在 Azure 表存储中时。它也是在 Particular 的文档中找到的参考信息:http://docs.particular.net/nservicebus/nservicebus-sagas-and-concurrency

我们注意到,在一个并发执行处理程序的 saga 中,对 saga 数据的修改似乎是在“最后一次将更改发布到 azure table storage 获胜”的情况下进行的。将 NSB 与 Azure 表存储结合用作 Saga 数据持久层时,这是预期的行为吗?

例子:

  1. Saga Data 中的整数属性,假设当前 = 5
  2. 5 个命令由这个 saga 中相同处理程序的 5 个实例处理
  3. 每个命令处理程序都会递减 saga 数据中的整数属性
  4. 在处理这 5 条消息后,saga 数据中整数属性的最终值实际上可能是 4 - 如果每条消息都由新的 saga 实例处理,可能在不同的服务器上,每个服务器都有一个 saga 数据的副本指示整数属性为 5,将其减为 4,然后备份。我刚刚描述的是一个非常并发的例子,但是如果同时处理 5 条消息中的任何一条,整数很可能大于 0,saga 数据整数属性达到 0 的唯一时间是 5 条命令恰好执行连载。

另外,由于 Azure 表存储支持乐观并发,是否可以像使用 Raven 作为持久性技术时为 RavenDB 启用该功能一样为表存储启用此功能?

如果这不可能,推荐的处理方法是什么?目前,我们正在订阅这样一种范式,即 saga 中可能同时处理多个消息的任何处理程序都不允许修改 saga 数据,这意味着我们对 saga 消息的协调是通过 saga 外部的方式完成的,而不是使用 Saga 数据正如我们最初的意图。

【问题讨论】:

    标签: concurrency nservicebus azure-table-storage nservicebus4


    【解决方案1】:

    在使用特定支持后 - 上述症状最终成为 NServiceBus.Azure 中的一个缺陷。此问题已由 NServiceBus.Azure 5.3.11 和 6.2+ 中的 Particular 修复。我个人可以确认更新到 5.3.11 解决了我们的问题。

    作为参考,此问题的一个明显迹象是引发以下异常且未得到处理。

    处理消息失败 Microsoft.WindowsAzure.Storage.StorageException:意外响应 操作代码:0

    异常的详细信息将表明“UpdateConditionNotSatisfied”——指的是乐观并发检查。

    感谢 Particular 的 Yves Goeleven 和 Sean Feldman 诊断并解决了这个问题。

    【讨论】:

    • 我们在 5.3.11 上,在 Azure 存储队列上运行大约一周后,我们收到了 6K 错误消息。 Microsoft.WindowsAzure.Storage.StorageException 持续失败:操作的意外响应代码:0
    【解决方案2】:

    azure saga 存储持久化使用乐观并发,如果多条消息同时到达,最后更新的应该抛出异常,重试并再次使数据正确。

    所以这听起来像是一个错误,你能分享一下你使用的是哪个版本吗?

    PS:去年我们解决了一个听起来与https://github.com/Particular/NServiceBus.Azure/issues/124 非常相似的问题,它已在 NServiceBus.Azure 5.2 及更高版本中得到解决

    【讨论】:

    • 我们在 NServiceBus 版本 4.6.4 中遇到了这个问题。问题 124 肯定是我在原始问题中描述的症状的根本原因。您是否会建议我们升级我们的解决方案以依赖 NSB 5.2?
    • NServiceBus Azure 5.2.0 应该与 NServiceBus.4.6.4 一起使用,所以应该只升级 azure 包就可以了
    • 希望提供其他版本信息:我们也在使用 NServiceBus.Azure 6.2 版。这让我相信我们已经在使用包含问题 124 修复程序的版本 - 特别是考虑到问题已经存在一年多。
    • 是的,这个修复也应该在 6.2 中,奇怪......我得研究一下。为了完整起见,您使用的是哪个 Azure 存储 SDK 版本?
    • 我已经为此创建了一个问题,并将尝试找出发生了什么github.com/Particular/NServiceBus.Azure/issues/248,但根据 azure 存储文档和来源github.com/Azure/azure-storage-net/blob/master/Lib/…,我们内部利用的替换操作应该执行代表我们的乐观并发......
    猜你喜欢
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多