2016-10-28 3 views
0

У нас есть два развертывания (Prod and Test) Azure Webjob, работающих с TimerTrigger. Оба веб-приложения имеют один экземпляр. Согласно this article, TimeTriggers используют одиночные блокировки, чтобы не было параллельного вызова. Эти два экземпляра используют одни и те же учетные записи. Проблема, с которой мы сталкиваемся, заключается в том, что только одно из развертываний, похоже, приобретает блокировку, в то время как другие не могут получить блокировку. Если мы остановим первый webjob, второй приобретает блокировку и начинает обработку, и наоборот.Azure Webjob таймер триггера не срабатывает

Зависит ли замок от учетных записей? Как мы можем убедиться, что оба этих развертывания имеют отдельный механизм блокировки и работают одновременно?

ответ

4

Вы правы, вы должны использовать различные учетные записи для хранения.

От documentation:

За кулисами TimerTrigger использует Singleton особенность WebJobs SDK, чтобы гарантировать, что только один экземпляр вашей функции срабатывает работает в любой момент времени. Когда запускается JobHost, для каждой из ваших функций TimerTrigger выполняется съемка blob (Singleton Lock). Этот запрещенный блокировка гарантирует, что в любой момент будет запущен только один экземпляр вашей запланированной функции. Если blob для этой функции в настоящее время не будет арендован, функция получит аренду и начнет работать по расписанию немедленно. Если аренда blob не может быть приобретена, обычно это означает, что выполняется другой экземпляр этой функции, поэтому функция не запускается в текущем узле. Когда это произойдет, хост будет периодически проверять, может ли он получить аренду. Это делается как своего рода «режим восстановления», чтобы гарантировать, что при работе в устойчивом состоянии, если экземпляр спускается, еще одно уведомление об этом и заберите, где другой остановился.

Если посмотреть на реализацию стопорного Механизм, (StorageScheduleMonitor.cs):

  • Работа приобретает замок (BLOB) внутри контейнера.
  • BLOB находится внутри определенного каталога (на основе HostId).
  • имя blob не настраивается.

Так на основе @ ВЛАДИМИР-bilyachat ответ, есть две возможности:

  • отделив счета хранения: имеет смысл, если у вас есть учетная запись для хранения каждой среды (Dev/постановка/прод)

  • Указание HosId свойство класса JobHostConfiguration:

    var config = new JobHostConfiguration(); 
    config.HostId = "dev|staging|prod"; 
    
+0

ли «Blob lease» означает блокировку хранения? Для меня не имеет смысла, что для нескольких развертываний используется один замок. –

+0

Обновлен мой ответ – Thomas

0

Убедитесь, что в вашем веб-приложении включен Always On, если вы используете TimerTrigger.

2

Использование счета разных хранений или установить хост

var config = new JobHostConfiguration(); 
config.HostId = "dev|prod" 
var host = new JobHost(config); 
host.RunAndBlock(); 
+0

Вы уверены, что HostId? Похоже, что речь идет о масштабировании. – Thomas

+0

@Thomas У меня была такая же проблема, когда я использовал то же хранилище для разработчиков и постановки. И это помогает мне –

+0

Хорошо бы знать :-) Когда я столкнулся с этой проблемой, я создал разные учетные записи для хранения – Thomas

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