在取消期间访问Service Fabric服务状态

时间:2018-03-26 10:14:33

标签: c# azure azure-service-fabric

我有一个Service Fabric群集,托管一个Orchestrator'类型的服务,使用FabricClient.ServiceManagementClient的CreateServiceAsync和DeleteServiceAsync方法旋转并关闭其他有状态服务以进行工作

该工作涉及处理在ReliableConcurrentQueue内短时间存储的消息。

我试图通过CancellationToken正确关闭这些服务,确保在删除服务之前队列完全耗尽了邮件,但却发现服务已经过了取消ReliableConcurrentQueue后,CancellationToken的访问权将被撤销。

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

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

  

&#34;在Service Fabric中,当一个Primary被降级时,首先要做的事情之一   发生这种情况是对基础状态的写访问被撤销。&#34;

     

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

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

有没有办法保证使用Stateful服务,Reliable Collections和CancellationTokens组合处理队列中的所有内容?或者我应该考虑Service Fabric可以提供的存储?

1 个答案:

答案 0 :(得分:0)

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

停止/更改服务的角色会导致CancellationToken传递给RunAsync

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

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