Безопасность потоков BLOB-объектов и очередей Azure

Мне нужна помощь в понимании безопасности потоков в лазурных классах CloudBlobClient, CloudQueueClient и CloudBlob.

Я разрабатываю рабочую роль, которая включает в себя несколько независимых процессоров заданий, где каждый из этих процессоров заданий читает из определенной очереди и записывает / обновляет некоторые контейнеры BLOB-объектов, которые могут быть одинаковыми.

Я хочу убедиться, что эти рабочие процессоры не наступают друг на друга.

1> Как я могу убедиться, что это так, не используя какой-либо вид блокировки? Если я назначу отдельные CloudBlobClient и CloudQueueClient каждому из моих процессоров заданий (которые все живут в одном и том же процессе), достаточно ли сказать, что они независимы друг от друга, и поскольку каждый обработчик заданий использует отдельный экземпляр клиента, они не будут работать друг в друга вообще?

2> Если в одном и том же процессоре заданий я пытаюсь использовать параллелизм в CloudBlobClient, используя Parallel.ForEach для параллельного вызова GetBlobReference или UploadText, нужно ли включать какую-то синхронизацию или эти методы безопасны для потоков? Документация Azure говорит, что это не так, но большинство примеров, которые я видел в Интернете, похоже, не применяют какой-либо механизм синхронизации к этим методам. Каков наилучший способ достичь этого? Я имею в виду лучший способ использовать один CloudBlobClient и вызывать GetBlobReference или UploadText параллельно?

2 ответа

Решение

Я посмотрел на CloudBlobClient документация по MSDN и что там написано:

Любые открытые статические (Shared в Visual Basic) члены этого типа являются потокобезопасными. Любые члены экземпляра не гарантированно являются потокобезопасными.

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

Сказав это, я использовал CloudBlobClient загрузить несколько элементов в Parallel.ForEach без каких-либо проблем.

Документация для случайно выбранной функции гласит: "Любые открытые статические... члены этого типа являются поточно-ориентированными. Любые члены экземпляра не гарантированно являются поточно-безопасными.", Но я бы предположил, что это встроенный шаблон, потому что кто-то не может быть надоело думать об этом. Я предлагаю вам изучить классы с помощью Reflector, но я ожидаю, что с ними все будет в порядке, потому что все классы, на которые вы ссылаетесь, являются просто хранилищами для свойств, которые в конечном итоге помещаются в запросы HTTP REST, когда вы выполняете вызов типа UploadText. До тех пор, пока вы не измените свойства для одного объекта в разных потоках (и я не думаю, что вам понадобится - создайте ссылку CloudBlobReference для каждой итерации вашего Parrallel.ForEach), я считаю, что вы будете в безопасности.

Другие вопросы по тегам