Завершение работы службы Service State без сохранения состояния - PullRequest
1 голос
/ 20 апреля 2019

У меня есть служба без сохранения состояния 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);
  }
}

1 Ответ

1 голос
/ 23 апреля 2019

Завершение работы сервисного экземпляра не поможет с вашей проблемой.

Главным образом потому, что SF снова включит его (перезапустит), когда служба отключится без SF, и служба начнет обработку сообщений менее чем через минуту.Таким образом, отключение службы не решит проблему.

Наилучшим способом устранения этих сбоев в службе является реализация стратегии повторных попыток / отключения / выключателя, чтобы дать больше времени между попытками или установитьфлаг для приостановки обработки до определенного времени.

Другой альтернативой является реализация службы мониторинга, которая удаляет службы при возникновении этих проблем, на самом деле это будет иметь тот же ожидаемый эффект, но, вероятно, будет более сложным, чем простоВнедрив в коде, потому что вам нужно будет реализовать уведомление в службе, использующей сообщение, монитор будет прослушивать эти события и затем связываться с SF, чтобы отключить службу, позже у вас также будет повторное создание служб, чтобы продолжитьобработки, если только вам действительно не нужно экономить ресурсы, выделенные для служб, это не дает больших преимуществ по сравнению с обработкой в ​​процессе обслуживания.

Все зависит от того, насколько сложной она должна быть.

...