【发布时间】: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