2011-05-16 22 views
5

Necesito ayuda para entender la seguridad de subprocesos en las clases azules CloudBlobClient, CloudQueueClient y CloudBlob.Azure Blob and Queue Thread Safety

Estoy desarrollando un rol de trabajador que incluye múltiples procesadores de trabajo independientes donde cada uno de estos procesadores de trabajos lee de una cola específica y escribe/actualiza en algunos contenedores de blobs que pueden ser los mismos.

Quiero asegurarme de que estos procesadores de trabajo no se pise el uno al otro.

1> ¿Cómo puedo asegurarme de que este sea el caso sin utilizar ningún tipo de bloqueo? Si asigno CloudBlobClient y CloudQueueClient por separado a cada uno de mis procesadores de trabajo (quienes viven en el mismo proceso), es suficiente decir que son independientes entre sí y porque cada procesador de trabajo usa una instancia de cliente separada, no se ejecutarán el uno al otro en absoluto?

2> En el mismo procesador de trabajos, si intento tener paralelismo en CloudBlobClient usando Parallel.ForEach para decir call GetBlobReference o UploadText en paralelo, ¿necesito incorporar algún tipo de sincronización o estos métodos son seguros para subprocesos? La documentación de Azure dice que no, pero la mayoría de los ejemplos que he visto en línea no parecen aplicar ningún tipo de mecanismo de sincronización en estos métodos. ¿Cuál es la mejor manera de lograr esto? Me refiero a la mejor manera de usar un CloudBlobClient y llamar a GetBlobReference o UploadText en paralelo?

Respuesta

2

que tenía un aspecto en el CloudBlobClientdocumentation on MSDN y lo que dice es:

estáticos públicos (Shared en Visual Basic) de este tipo son seguros para subprocesos. No se garantiza que ningún miembro de instancia sea seguro para subprocesos.

Como no es un miembro estático, no se garantiza que sea seguro para subprocesos. Si quiere asegurarse de no quedar atrapado por ningún problema de subprocesamiento que la MS haya perdido en la biblioteca del cliente de almacenamiento, entonces sí debe asegurarse de que cada subproceso tenga su propio cliente (tal vez crear una variable ThreadStatic) .

Habiendo dicho eso, he utilizado CloudBlobClient para cargar varios elementos en un Parallel.ForEach sin que cause ningún problema.

+0

Pero estoy un poco de acuerdo con Oliver ya que esto es para ser más del comentario de la placa de la caldera. No pude encontrar ningún problema informado sobre esto, excepto cuando se usa uno superior a uno para ParallelOperationThreadCount. Prefiero no bloquear el código si no es necesario. – iCode

+0

Usted ve el comentario sobre seguridad de hilos en prácticamente todas las clases del marco.ParallelOperationThreadCount es utilizado por la biblioteca para crear subprocesos internamente, por lo que esto no debería afectar lo que está haciendo. Las clases de los clientes son muy livianas de crear. – knightpfhor

0

La documentación de un randomly chosen function dice "Cualquier miembro estático estático ... los miembros de este tipo son seguros para subprocesos. No se garantiza que ninguno de los miembros de la instancia sea seguro para subprocesos", pero supongo que es un texto repetitivo porque alguien podría No te molestes en pensar sobre eso. Le sugiero que examine las clases usando Reflector, pero esperaría que estuvieran bien porque todas las clases a las que se refiere son solo repositorios de propiedades que terminan en solicitudes HTTP REST cuando realiza una llamada como UploadText. Siempre y cuando no cambies las propiedades de un objeto en diferentes hilos (y no creo que necesites - crear una CloudBlobReference para cada iteración de tu Parrallel.ForEach) entonces creo que estarás a salvo.

+0

Estoy de acuerdo con usted ya que esto podría ser más una declaración general. ¡Mi reflector ya no funciona y me pide el número de mi tarjeta de crédito! es por eso que no pude verificarlo. Desearía que alguien del equipo de Azure pudiera aclarar esto. – iCode

+0

Red Gate ahora haga una versión anterior de Reflector disponible de forma gratuita. Probablemente no lo hagan fácil de encontrar. –