Service Fabric — как изящно завершить работу приложения

У меня есть набор служб без сохранения состояния и с сохранением состояния в приложении. Очевидно, я бы хотел, чтобы они работали идеально, но бывают случаи, когда мое приложение знает, что оно не может восстановиться после сбоя. Например, если он не может загрузить свои параметры конфигурации из KeyVault (и резервных копий), то нет смысла продолжать.

Итак, вопрос в том, как сказать сервисной структуре отказаться от всего приложения? Я пробовал Partition.ReportFault(FaultType.Permenant), но благослови его, он пытается запустить новый раздел. :-)

Очевидно, что мы отправляем информацию об оповещениях в отделы эксплуатации и разработки, включая автоматические электронные письма, чтобы они могли восстановиться, но замечательно, если Service Fabric может принять запрос на «самоубийство», а не генерировать (количество реплик x количество повторных попыток) количество отчетов о фатальных ошибках и, в конечном итоге, умирать.


person MarkD    schedule 19.09.2016    source источник


Ответы (1)


Вам нужно удалить службу . Это простая операция управления, которую может выполнить любой пользователь административный доступ к кластеру. Служба может удалить себя таким образом, если вы хотите, чтобы она совершила самоубийство:

using (FabricClient fc = new FabricClient())
{
    fc.ServiceManager.DeleteServiceAsync(this.Context.ServiceName);
}

Обратите внимание, что для этого требуется, чтобы служба имела доступ администратора к операциям управления кластером. Возможно, вам это не нужно, если у службы есть конечные точки с выходом в Интернет (если кому-то удастся воспользоваться уязвимостью в вашей службе и взять под контроль процесс, вы обречены). В этом случае было бы лучше делегировать задачу удаления другому сервису — исполнителю, если хотите, — который имеет доступ администратора, доступен только изнутри кластера и может удалить сервисы, которые в любом случае мертвы в воде.

person Vaclav Turecek    schedule 22.09.2016
comment
Спасибо за это. Как вы предлагаете, я бы, скорее всего, использовал службу палача, поскольку у нас есть общедоступные конечные точки. Я буду использовать аутентифицированный способ отправки сообщения kill me, чтобы задача администратора могла проверить подлинность запроса и соответствующим образом проинформировать операционную систему. - person MarkD; 22.09.2016