Azure WCF accediendo a archivos de disco

Tengo un servicio WCF alojado en Windows Azure como "servicio en la nube". Cuando se inicia el servicio, necesita completar los datos de los archivos/disco en su memoria para que se acceda rápidamente (en otras palabras, en caché). En este momento, estoy usando la carpeta C:\Documents\Filestoprocess para que WCF llame a la carpeta y complete los datos de esa carpeta en su memoria. Tengo como 5,000 archivos pequeños. ¿Cómo hago esto en Azure? ¿Hay una ruta de carpeta a la que pueda llamar dentro de WCF para que WCF llame a estos archivos y abra cada archivo y guarde cada dato en los archivos? Realmente no estoy buscando un acceso complicado de Blob a través de la red usando ancho de banda. Estoy buscando acceso de E/S de disco simple a estos archivos desde el "servicio en la nube" de WCF que se ejecuta en su propia dirección web pública.

preguntado el 24 de agosto de 12 a las 19:08

3 Respuestas

Debe intentar usar un servicio de almacenamiento en la nube para almacenar datos, ya que si escribe en el sistema de archivos local, puede destruirse al reiniciar el servicio o reciclarlo.

Puede considerar el uso del servicio Azure Drive, que es como crear una inmersión de disco. Está encima del almacenamiento de blobs.

Pero si realmente desea escribir y leer datos en el sistema de archivos local, consulte esta publicación de blog http://blog.codingoutloud.com/2011/06/12/azure-faq-can-i-write-to-the-file-system-on-windows-azure/

Habla sobre la configuración de su definición de servicio para permitir la escritura en el sistema de archivos local.

Respondido 24 ago 12, 19:08

Dependiente en el tamaño de sus instancias obtendrá un disco no persistente donde puede almacenar este tipo de datos temporales. El mínimo es de 20 GB para una instancia extra pequeña. No debe acceder al disco directamente, pero necesita usar un recurso local en su lugar, que puede configurar en su definición de servicio archivo o en Visual Studio (haga doble clic en su Web / Rol de trabajo).

Este almacenamiento no es persistente, esto significa que si elimina su implementación, si reduce la cantidad de instancias, en caso de problemas de hardware, ... perderá todos los datos guardados aquí. Si desea conservar sus archivos, debe usar el almacenamiento de blobs en su lugar. Pero en su caso, donde necesita los archivos como algún tipo de mecanismo de almacenamiento en caché, los recursos locales son perfectos.

Y si su objetivo es almacenar datos en caché, es posible que desee echar un vistazo a las funciones de almacenamiento en caché incluidas en Windows Azure: Almacenamiento en caché en Windows Azure

Respondido 24 ago 12, 20:08

El acceso a blobs no es complejo. De hecho, podría hacer una sola descarga de un archivo zip desde el almacenamiento de blobs al disco local, descomprimirlo y luego preparar su servicio wcf a partir de esos 5,000 archivos pequeños.

Comprar esta página de msdn documentando DownloadBlobToFile(). Las partes esenciales:

CloudBlobClient blobClient = 
        new CloudBlobClient(blobEndpoint, new StorageCredentialsAccountAndKey(accountName, accountKey));

    // Return a reference to the blob.
    CloudBlob blob = blobClient.GetBlobReference("mycontainer/myblob.txt");

    // Download the blob to a local file.
    blob.DownloadToFile("c:\\mylocalblob.txt");

Ahora: no estoy de acuerdo con guardar en la carpeta raíz en C:. Más bien, debe obtener algo de almacenamiento local (fácilmente configurable). Una vez que configure el almacenamiento local en la configuración de su función, solo solicite el entorno de función y solicite la ruta raíz:

var localResource = RoleEnvironment.GetLocalResource("mylocalstorage");
var rootPath = localResource.RootPath;

Nota: Como mencionó @KingPancake, usted podría utilice una unidad de Azure. Sin embargo, recuerde que solo una instancia puede escribir en una unidad de Azure. Tendría que hacer instantáneas adicionales para sus otras instancias. Creo que es mucho más simple para usted ir con un blob simple, copiar sus archivos (ya sea como un archivo zip o archivos individuales) y continuar desde allí.

Mencionaste preocupación con la red + ancho de banda. No paga por el ancho de banda dentro del mismo centro de datos. Además: es extremadamente rápido: 100 Mbps por núcleo. Entonces, incluso con una instancia pequeña, tendrá sus archivos copiados muy rápidamente, más aún cuando vaya a tamaños de instancia más grandes.

Un último pensamiento: las únicas otras formas de obtener acceso a sus 5,000 archivos, sin usar el almacenamiento de blobs o Azure Drives (que están montados como vhd en el almacenamiento de blobs) serían descargar los archivos de una fuente externa o agruparlos con su Windows Paquete de Azure (y luego aparecerían en la carpeta de su aplicación, en cualquier subcarpeta en la que los haya metido). La paquetización tiene dos inconvenientes:

  • Más tiempo para cargar su paquete de implementación debido al tamaño adicional
  • Imposibilidad de cambiar cualquiera de los archivos individuales sin volver a implementar el paquete.

Al almacenar en un blob, puede cambiar fácilmente uno (o todos) de sus archivos pequeños sin volver a implementar su código; solo necesita indicarle que vuelva a leer desde el almacenamiento de blobs o reiniciar las instancias para que descarguen automáticamente el nuevo archivos

Respondido 24 ago 12, 20:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.