2012-05-30 8 views
14

¿Debo crear instancias de CloudStorageAccount y CloudBlobClient cada vez que deseo obtener blob del almacenamiento? Por ejemplo, implementé un proveedor de ruta virtual personalizado para trabajar con un almacenamiento de blobs. Cuál es la mejor solución de diseño: creación de instancias de CloudStorageAccount y CloudBlobClient una vez como campos privados de mi proveedor de rutas virtuales personalizado, o uso de una utilidad con métodos estáticos (compartidos) que crea instancias de CloudStorageAccount y CloudBlobClient cada vez que quiero obtener un blob de un ¿almacenamiento? ¿Qué tan caro es desde el punto de vista del rendimiento?¿Qué tan caro es la creación de instancias de CloudStorageAccount o CloudBlobClient desde el punto de vista del rendimiento?

+1

, consulte http://stackoverflow.com/a/9934393/468244 ... porque la creación no es "gratuita" y la reutilización normalmente no es un problema que probablemente debería preferir reutilizar. –

+0

Ok. Gracias. Pero, ¿estas instancias son seguras en el contexto de VirtualPathProvider? Como entendí, solo hay una instancia de VirtualPathProvider por aplicación (si creo una nueva instancia y la registro en global.asax en application_start), ¿entonces no debería haber ningún problema con una seguridad de hilos? – eternity

+0

como @sandrino afirmó que no debería haber problemas con los hilos. Dependiendo de su aplicación, también podría ser necesario mantener 'CloudBlobContainer's después de' CreateIfNotExist' en ellos. Pero eso depende del caso de uso. –

Respuesta

14

Puede reutilizar CloudStorageAccount y CloudBlobClient ya que no tienen ningún estado (ver la respuesta de Steve Marx en el enlace de Simon). El SDK es de código abierto y puede simplemente look at the source on GitHub.

Si echas un vistazo a la clase CloudStorageAccount, puedes ver que su objetivo principal es asegurarte de que termines con StorageCredentials con Blob/Queue y TableEndpoint. Al observar el constructor del CloudBlobClient, puede ver que almacena las credenciales de almacenamiento, el punto final Uri y algunos valores predeterminados.

No hay nada complicado aquí y no hay ninguna E/S de red lo que significa que el procesamiento es muy barato. Pero cuando piensas en el rendimiento, cada pequeña optimización puede ser útil, así que puedes almacenarla de forma segura en una variable estática (esto puede afectar las pruebas de tu unidad) o si usas un contenedor IoC puedes elegir usar una única instancia para todo el contenedor.

Ahora debe tener algo en cuenta. Tanto su CloudStorageAccount como su CloudBlobClient guardarán las credenciales de almacenamiento y el punto final Uri. Pero, ¿qué ocurre si cambia esta información a través del portal (es posible que haya cambiado la clave de su cuenta de almacenamiento)? Si almacena una instancia única de CloudStorageAccount/CloudBlobClient, es posible que necesite manejar el evento RoleEnvironment.Changing para 'actualizar' estos objetos con la nueva información de la cuenta de almacenamiento.

+0

Si este es el caso, entonces por qué estoy recibiendo un error, http://stackoverflow.com/questions/24229288/parallel-blob-upload-throwing-404-bad-request-intermittently – user960567

Cuestiones relacionadas