2016-01-07 9 views
1

Мы изучаем создание системы, которая имеет область кода, требующую взаимного исключения. В выделенном хостинге среды на одном сервере, мы могли бы использовать этот простой код, который будет работать на нескольких потоках:Azure web job - Внедрение взаимного исключения в облаке

SomeAsyncOperation(); 
lock(locker) 
{ 
    SomeSyncOperation1(); 
    SomeSyncOperation2(); 
} 

Будет ли эта работа в облаке (в предположении, что webjobs может работать на нескольких физических машинах)? В частности, Azure. Если не так, как это будет реализовано? До сих пор я смотрел CloudBlockBlob и competing consumer pattern. Что люди делают для достижения этого?

Заранее спасибо.

Edit: подробнее

Operation1 выполняет поиск по таблице, то работы2 добавляет запись как очереди и таблицы, если Operation1 ничего не находит (в противном случае исключение). Чтобы предотвратить добавление повторяющихся элементов в очередь, важно, чтобы Operation1 и Operation2 выполнялись атомарно во всех потоках (приложение работает с использованием async/await).

Следующий сценарий является примером того, как состояние гонки может возникнуть:

T1  T2 
O1()  
      O1() 
      O2() 
O2() 

На нити T1 operation1 не найден дубликат. Поток T2 появляется и добавляет дубликат. Затем Threat T1 запускает операцию2, которую она не должна была делать.

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

+0

являются веб-камерами, запускаемыми или непрерывными? –

+0

Он будет работать ежедневно, но мы также хотели бы запустить его вручную. Это изменяет поведение? – garryp

+0

Что такое природа заблокированного ресурса, который может быть использован только одним экземпляром процесса? Я спрашиваю, потому что Webjobs могут обрабатывать многопоточность, но вы также можете [установить их в один поток] (https://azure.microsoft.com/en-us/documentation/articles/websites-dotnet-webjobs-sdk -storage-queues-how-to /), и если вы не расширяете приложение App, у вас есть однопоточный уникальный Webjob. Мы используем Queues для этого сценария, при этом несколько Webjobs потребляют сообщения, но только одна функция может читать одно сообщение в данный момент времени, например, конкурирующий шаблон потребителя. –

ответ

4

Azure WebJobs SDK имеет декларативный SingletonAttribute, который может применяться к функциям задания, чтобы гарантировать, что только один экземпляр этой функции работает в любой момент времени, даже в нескольких экземплярах с масштабированием. За кулисами он распределяет блокировку через Azure Blob Leases. Подробнее о Singleton можно найти здесь, в wiki. Вот пример функции (полный пример можно найти в samples repo):

[Singleton] 
    public static async Task ProcessWorkItem([QueueTrigger("workitems")] WorkItem workItem) 
    { 
     // Do your work - lock is maintained until this function completes 
    } 

Эта функция будет срабатывать всякий раз, когда новое сообщение очередь записывается в workitems очереди. Перед тем, как функция начнет выполнение функции , распределенная блокировка (аренда blob) приобретается для функции и удерживается до завершения функции. Если одновременно запускается другой экземпляр функции, этот экземпляр будет опросить блокировку и начнется после освобождения блокировки.

Есть дополнительные опции, которые вы можете использовать с Singleton, включая более мелкозернистые блокировки. Например, если тип WorkItem включает в себя свойство Region, [Singleton("{Region}")] будет автоматически привязываться к этому значению во время выполнения, поэтому только экземпляры функции для элементов в одном регионе будут сериализованы. Вы также можете заблокировать по разным функциям, что позволит вам аннотировать две разные функции с той же областью Singleton, что и экземпляры обеих функций имеют одну и ту же блокировку.

Конечно, как и при синхронизации процесса, вы должны учитывать, сколько заблокировать спор у вас будет в вашей системе и дизайн соответственно.

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