Я работаю над несколькими Azure веб-заданиями, которые используют Redis для кэширования и трансляции сообщений. Каждое задание выполняется непрерывно (как консольное приложение) и может иметь несколько экземпляров в любое время (в зависимости от правил масштабирования). Когда задание запускается, оно подписывается на канал Redis для получения уведомлений:
...
var subscriber = multiplexer.GetSubscriber();
await (subscriber.SubscribeAsync("channel", HandleMessage));
...
private void HandleMessage(RedisChannel channel, RedisValue value)
{
...
}
Мы используем StackExchange.Redis 1.2.6.
Моя проблема заключается в том, что я не могу определить, когда Экземпляр закрывается, поэтому у меня нет места, где я могу надежно позвонить UnsubscribeAll()
- все, что я пробовал до сих пор, не работает:
- Событие AppDomain.Unload
- AppDomain.ProcessExit event
- WebJobsShutdownWatcher
До сих пор я проводил только локальное тестирование по этому вопросу. Я не уверен, что делаю что-то не так - есть много вопросов об обнаружении выключения веб-работы - я (и все мои коллеги) закрываю локальные задания, используя Ctrl- C или нажимая X
в окне консоли так что процесс просто убивается - никаких событий не происходит. Из-за этого я не могу протестировать ни одно из своих решений локально. Неправильно позволять процессу завершаться без очистки, но я не могу придумать никакого другого решения.
Нужно ли отписываться от канала Redis или безопасно забыть об этом? (В качестве альтернативы, может ли какое-либо из моих решений работать надежно в Azure?)