Завершение работы экземпляра службы без отслеживания состояния 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);
  }
}

person Amlan    schedule 20.04.2019    source источник


Ответы (1)


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

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

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

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

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

person Diego Mendes    schedule 23.04.2019