【问题标题】:Service Fabric Statefull Service how to avoid InvalidOperationException on long running transaction with large valuesService Fabric Stateful Service 如何避免 InvalidOperationException 长时间运行的大值事务
【发布时间】:2020-05-11 06:37:51
【问题描述】:

我有一个运行时间相当长的事务,它更新多个可靠集合上的大值(字典)。我一直遇到 InvalidOperationExceptions(事务正在提交或回滚),重试操作只会再次导致异常。有什么办法可以缓解这个问题吗?

我认为这与文档中所说的事务日志的事务阻塞截断有关。放大或缩小日志会有帮助吗?

https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-reliable-services-reliable-collections-guidelines

请处理 InvalidOperationException。由于各种原因,系统可能会中止用户交易。例如,当 Reliable State Manager 将其角色更改为 Primary 或长时间运行的事务阻止截断事务日志时。在这种情况下,用户可能会收到 InvalidOperationException 指示他们的事务已经终止。假设用户没有请求终止事务,处理此异常的最佳方法是处理该事务,检查是否已发出取消令牌(或副本的角色已更改),如果没有则创建新事务并重试。

【问题讨论】:

  • 没有上下文这很难回答。考虑列出密钥,然后在单独的事务中处理每个密钥?也许?
  • 是的,如果我将操作拆分为多个事务,它会起作用,但是如果出现错误,我会失去一致性,所以我真的需要一个事务来工作。我怎样才能获得更多信息来了解导致事务回滚的原因?有这么多可配置的设置,我觉得在某个地方增加一些限制会有所帮助,我只是不知道是哪一个。
  • 增加限制很可能只会延迟相同的问题,如果任何配置有帮助的话。如果应用程序设计依赖于有争议的数据结构,锁将始终显示为性能问题。如果可能,考虑如何减少数据的争议。作为一般规则(此处可能适用也可能不适用) - 采用尽可能小的锁以确保一致性。
  • 查看我发布的答案。我相当确定问题是由于数据的大小,事务日志在事务期间被截断。提高 minLogSizeInMb 完全解决了这个问题。我不认为锁是问题所在,因为只有一个线程访问数据时它会一直失败。我的应用程序已设置,因此在给定时间只有一个线程会处理密钥,基本上是序列化事务。
  • @StenPetrov 你说得对,增加 MinLogSizeInMB 只会推迟问题。最终会有一个交易在交易中截断的操作,我再次收到错误。我知道文档说要针对这种确切情况处理 InvalidOperationException 并重试,但这感觉很脏,因为不仅事务日志截断会捕获各种异常。例如,如果我在没有项目的集合上调用 Single(),它也会抛出 InvalidOperationException,并且无需重试。

标签: azure-service-fabric service-fabric-stateful


【解决方案1】:

不知道到底是哪个设置做的,但我得到了它与以下的工作

        new ReliableStateManagerConfiguration(new ReliableStateManagerReplicatorSettings
        {
            CheckpointThresholdInMB = 4096,
            MaxRecordSizeInKB = 1024 * 1024,
            MinLogSizeInMB = 4096,
        })))

考虑到由于值较大,MinLogSizeInMB 会阻止它在事务期间尝试截断日志。

不幸的是,这只允许完成单个事务。最终,日志必须截断,并且当发生这种情况时,无论哪个事务正在进行,都将失败并且必须重试。如果有办法解决这个问题会很好。我很想使 MinLogSizeInMB 成为一个巨大的数字,以使这些错误尽可能少。

【讨论】:

    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 2019-01-28
    • 2017-11-09
    • 2016-09-28
    • 2018-03-30
    • 2019-08-31
    • 2016-03-16
    • 2017-05-20
    相关资源
    最近更新 更多