首页 > 解决方案 > 关闭 Service Fabric 无状态服务的实例

问题描述

我有一个 Service Fabric 无状态服务,它作为后台作业运行并从队列中读取。对于它收到的每条消息,它都会调用一个外部 API。

如果外部调用的失败率很高,我想关闭服务的特定实例。如果我无法处理这些消息,我不想从队列中读取它们。

从 RunAsync() 方法关闭实例的最佳方法是什么?我抛出 OperationCanceledException 来关闭实例,但这是正确的方法吗?

protected override async Task RunAsync(CancellationToken cancellationToken)
{
  while (true)
  {
    cancellationToken.ThrowIfCancellationRequested();
    if (/* error rate is high*/)
    {
      throw new OperationCanceledException();
    }
    await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
  }
}

标签: azure-service-fabricservice-fabric-stateless

解决方案


关闭服务实例不会帮助您解决问题。

主要是因为SF会在没有SF请求的情况下关闭服务时再次启动(重启),并且服务将在不到一分钟后开始处理消息。因此,关闭服务不会解决问题。

最好的方法是在服务中处理这些故障,即实施重试/回退/断路器策略以在尝试之间留出更多时间,或者设置一个标志以暂停处理直到特定时间。

另一种选择是实现一个监控服务,当这些问题发生时删除服务,这实际上会产生您期望的相同效果,但可能比仅在代码中实现更复杂,因为您必须在服务消费消息,监视器会监听这些事件,然后联系 SF 关闭服务,稍后,您还必须重新创建服务以继续处理,除非您确实需要节省分配给服务的资源,与在役处理相比,这并没有带来太多好处。

这完全取决于它需要有多复杂。


推荐阅读