2016-06-16 2 views
0

WebJobs SDK supports, передающий аргумент CancellationToken функции, которая используется SDK для уведомления о запущенных функциях остановки хоста. Я заметил, что запущенные функции не уведомляются, если приложение/функция заменяется новой версией. Это проблема, если функции предназначены для работы в течение более длительного периода времени, так как в итоге вы можете запустить «старую» логику, не зная ее.Обнаружение обновления/перераспределения внутри работы Функция Azure

Например, если вы создаете простую функцию, которая будет работать вечно (или до отмены):

using System; 
using System.Threading; 

public static async Task Run(string input, TraceWriter log, CancellationToken token) 
{ 
    while (!token.IsCancellationRequested) 
    {  
     token.ThrowIfCancellationRequested(); 
     log.Info($"Input: {input}"); 
     await Task.Delay(2000, token).ConfigureAwait(false); 
    } 
} 

Если вы бежите, что, а затем обновить код каким-либо образом и перераспределять (или сохранить, если вы находитесь на портале Azure Functions), вы увидите, что функция перекомпилирована, но экземпляр текущей функции не остановлен и продолжит выполнение предыдущей версии кода до тех пор, пока вы не отключите его вручную.

Есть ли способ обнаружить перераспределение внутри выполняемой функции?

ответ

1

Azure Functions выполняет оценку модели WebJobs SDK CancellationToken, когда хост приложения функций отключается/перезапускается. Однако в приведенном выше сценарии, где вы просто обновляете сам код функции, не будет запускать перезапуск хоста, поэтому токен не отменяется. В качестве оптимизации мы только перезапускаем хост, когда это абсолютно необходимо, а в случае простых обновлений кода мы можем поддерживать хост и просто использовать новый код при любых новых вызовах.

Это хорошо работает для обычных функциональных сценариев, в которых функции invocations не живут «навсегда». Я бы сказал, что функция while(true) - это анти-шаблон. Функции не предназначены для такого типа вещей, и вы, скорее всего, сможете лучше выполнить свои сценарии. В соответствующей заметке также будут помещены некоторые временные ограничения (настраиваемые) для выполнения функций перед GA.

+0

В моем случае CancellationToken не запрашивает аннулирование при перезапуске приложения или повторном развертывании посередине или запуске функции. Любые подсказки? – akazemis

Смежные вопросы