【问题标题】:Shutting down instance of Service Fabric stateless service关闭 Service Fabric 无状态服务的实例
【发布时间】:2019-09-10 14:36:35
【问题描述】:

我有一个 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-fabric service-fabric-stateless


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-10-01
      • 2016-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-07
      • 2018-04-09
      • 2017-12-13
      • 2016-11-23
      相关资源
      最近更新 更多