【问题标题】:Accessing Service Fabric service state during cancellation在取消期间访问 Service Fabric 服务状态
【发布时间】:2018-09-04 10:51:58
【问题描述】:

我有一个托管“Orchestrator”类型服务的 Service Fabric 群集,该服务使用FabricClient.ServiceManagementClient 的 CreateServiceAsync 和 DeleteServiceAsync 方法启动和关闭其他有状态服务以完成工作。

这项工作涉及处理在ReliableConcurrentQueue 中短时间存储的消息。

我正在尝试通过CancellationToken 处理这些服务的正常关闭,方法是确保在删除服务之前队列中的消息完全耗尽,但我发现该服务对ReliableConcurrentQueue 的访问权限已被撤销一旦CancellationToken 被取消。

例如,从使用 CancellationToken 注册的回调调用 StateManager.GetOrAddAsync<T>() 会导致 FabricNotReadableException,其中包含消息“主状态管理器当前不可读”。

仔细阅读,这似乎是预期的行为:

“在 Service Fabric 中,当主节点降级时,首先要做的事情之一是 发生的情况是对底层状态的写访问被撤销。”

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

此外,this question 的答案表明 FabricNotReadableException 通常是暂时性问题,可以重试受影响的调用。在此示例中似乎并非如此。以不同的频率/延迟多次重试似乎都以同样的方式失败。

有没有办法保证队列中的所有内容都使用有状态服务、可靠集合和取消令牌的组合来处理?还是我应该研究 Service Fabric 可以提供的存储之外的存储?

【问题讨论】:

    标签: c# azure azure-service-fabric


    【解决方案1】:

    考虑在RunAsync内部执行队列项处理。

    停止/更改服务的角色会导致传递给RunAsyncCancellationToken 被取消。

    一旦发生这种情况,您需要确保仅在队列深度为 0 时退出该方法。

    此外,一旦请求取消,您可能应该停止允许新项目入队。

    【讨论】:

    • 这也是我认为它应该工作的方式 - 遗憾的是,一旦传递给 RunAsync 的 CancellationToken 被取消,StateManager 上的操作会抛出 FabricNotReadableException,即使您是从 RunAsync 中调用它们。
    猜你喜欢
    • 2017-06-22
    • 2017-06-26
    • 2017-10-30
    • 2021-08-11
    • 2016-08-07
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 2020-05-06
    相关资源
    最近更新 更多