Очереди Azure: периодически помещайте сообщение в очередь только из одного экземпляра рабочей роли
Я хочу периодически (в день) выполнять определенное задание для нашей роли в Интернете / работнике. У меня есть несколько экземпляров в моей облачной службе, и я хочу, чтобы только один из этих экземпляров выполнял эту задачу в день (например, Instance0 может сделать это один день, на следующий день это может быть Instance1, выполняющий работу, но 0 и 1 не будут пытаться сделать ту же работу в тот же день / период)
Очереди Azure, по-видимому, являются отличным способом для достижения этой цели, потому что по своей структуре только один экземпляр удалит сообщение из очереди (при условии, что он удалит его после выполнения работы).
У меня проблемы с тем, чтобы найти способ помещать в очередь только одну копию этого сообщения в день. Единственный способ сделать это - ежедневно отправлять сообщения из заданий планировщика Azure.
Моя проблема с планировщиком Azure заключается в том, что мне нужно создать задание для каждой отдельной учетной записи хранения во всех моих развертываниях.
Есть ли способ сделать это из облачной службы, не принимая зависимость от планировщика?
2 ответа
Если вы не хотите иметь зависимость от Планировщика, рассмотрите возможность использования блоб-аренды в качестве своего рода семафора. http://justazure.com/azure-blob-storage-part-8-blob-leases/
В определенное время дня ваши рабочие экземпляры будут соревноваться за аренду какого-то большого хранилища. Тот, кто получает аренду, не дает другим экземплярам получать эту аренду и может помещать сообщения в очередь.
Сказав это, почему вы боитесь зависимости планировщика? Сделайте так, чтобы он запускал одну работу, которая поставит в очередь сообщение "начать работу". Ваши экземпляры следят за этой очередью. Тот, кто заберет это сообщение, сможет запустить его через все свои учетные записи хранения и поставить в очередь отдельные рабочие сообщения хранилища для всех экземпляров.
Если вы знаете, что вам нужно выполнять одну работу в день, я не понимаю, почему вам нужно использовать очередь - вы можете просто запустить запланированную работу один раз в день. Если задание нужно запустить только при соблюдении определенного условия, я бы просто встроил эту логику в запланированное задание - возможно, установив свойство в таблице или что-то в этом роде.