Получение нескольких аренд на больших двоичных объектах

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

Я надеюсь, что это так, я использовал аренду больших двоичных объектов в качестве распределенных блокировок в Azure.


person robertkroll    schedule 04.06.2012    source источник


Ответы (2)


Вам нужно прочитать эту статью «Управление параллелизмом в Windows Azure с помощью аренды» от @Smarx, чтобы получить точный ответ:

Автор @Smarx: «Аренда — это распределенный эквивалент блокировки. Блокировки редко, если вообще когда-либо, используются в распределенных системах, потому что, когда компоненты или сети выходят из строя в распределенной системе, легко оставить всю систему в тупиковой ситуации. Аренда облегчает эту проблему, так как есть встроенный тайм-аут, по истечении которого ресурсы снова будут доступны».

http://blog.smarx.com/posts/managing-concurrency-in-windows-azure-with-leases

person AvkashChauhan    schedule 04.06.2012

Пока существует договор аренды, другой договор аренды не может быть получен. Но срок аренды истекает через минуту, если его не продлить.

person user94559    schedule 04.06.2012
comment
Спасибо за ответ. На самом деле я использовал ваш код из github: в AutoRenewLease.Dispose () метод аренды освобождается вручную. Может случиться так, что один поток освобождает аренду, а второй поток получает ее. Передаваемое действие вызывается дважды. - person robertkroll; 06.06.2012
comment
Я не уверен, что следую. Не могли бы вы поделиться кодом или лучше объяснить, что вы пытаетесь сделать? Если один поток освободит аренду, другой поток должен получить ее. - person user94559; 06.06.2012
comment
Конечно. Но вызываемое действие должно происходить только один раз. Если два потока используют AutoRenewLease, может случиться так, что один поток получил аренду, выполнил действие и освободил аренду, в то время как в то же время поток вошел в конструктор AutoRenewLease и может получить вторую аренду. Таким образом, действие вызывается дважды, чего никогда не должно происходить. Из метода Dispose() я удалил строку _blob.ReleaseLease(). - person robertkroll; 07.06.2012
comment
Если вы удалите строку ReleaseLease(), вы сохраните аренду на целую минуту без всякой причины. Если это исправляет ошибку в вашем коде, это означает, что у вас есть ошибка синхронизации. (Это похоже на добавление оператора сна, чтобы что-то исправить.) - person user94559; 07.06.2012