Pregunta

SharpZipLib . Tenemos que ser capaz de descomprimir los archivos en el servidor y colocarlos en carpeta separada. La solicitud para descomprimir un archivo será de usuario en una página web. Me imagino que si los archivos son lo suficientemente grandes que tomará mucho tiempo para descomprimir. No queremos que los usuarios pueden pegar en la página a la espera de descomprimir para completar el fin de continuar navegando por el sitio.

¿Qué es una buena manera de manejar esta situación: escindir un subproceso diferente para cuidar de archivo descomprimir, crear un servicio de Windows independiente que descomprimir los archivos, o .... ¿qué?

¿Qué son los pros y los contras de hacerlo a través de hilo separado o servicio de la ventana?

¿Fue útil?

Solución

Ventajas de un proceso separado
El trabajo realizado en un proceso separado se puede desacoplar en el tiempo, así como físicamente, y desde el punto de vista de seguridad, desde el flujo de la página. Desacoplado en el tiempo: Si lo desea, puede amortiguar las solicitudes para descomprimir las cosas hasta "después" cuando la carga es menor y cuando se tiene ciclos de CPU libres de hacerlo.

también desacoplada físicamente; para un sistema a gran escala, puede tener varios procesos de trabajo, incluso desplegado en varias máquinas independientes, haciendo este trabajo de forma asincrónica, y que la capa de procesamiento puede escalar de forma independiente del procesamiento de páginas web. En todo sistema existen cuellos de botella, y la ventaja de implementaciones distribuidas es que se puede escalar las cargas de trabajo separadas de forma independiente, para eliminar los cuellos de botella de manera más eficiente.

Yo diría, sin embargo, que este último beneficio es sólo útil en sistemas de muy gran escala. En la mayoría de los casos usted no tendrá el tipo de volumen de transacciones que se beneficiaría de una capa de escalado física independiente. Esto es cierto no sólo de su carga de trabajo, pero del 98% de todas las cargas de trabajo. El principio se aplica a YAGNI escalabilidad, también.

desacoplamiento física también permite que las cargas de trabajo dispares (flujo de página y desempaquetar postal) que se desarrollarán de forma independiente. En otras palabras, suponiendo que el elemento de trabajo no era un simple "descomprimir un archivo", pero era algo más complejo, con múltiples pasos y puntos de decisión en el camino. Diseñar el procesador de trabajo en un proceso separado permite que el flujo de la página que se construyó y probó independientemente de la transformación workitem. Esto puede ser una buena ventaja si tienen que evolucionar de forma independiente.

Este desacoplamiento físico también es muy bueno si workitems llegarán a través de diferentes canales. Supongamos que la página web no es la única manera de que un elemento de trabajo para llegar. Suponga que tiene una caída de ftp, un servicio web, o una casilla de correo electrónico de la máquina-supervisado que también pueden recibir elementos de trabajo. En los casos que lo haría tiene sentido tener la physicall procesamiento de elemento de trabajo disociada de la transformación página web.

Por último, estas cosas están desacoplados en la seguridad durante la ejecución. En algunas implementaciones de servidores de aplicaciones web, las normas de seguridad prohíben el servidor web de la escritura en el disco - servidores web no tienen almacenamiento en disco grabable. Un proceso de trabajo asynch separada se puede implementar en una parte separada de la red, con gran capacidad de almacenamiento y quizá se ve limitada por un conjunto separado de los requisitos de seguridad. Esto puede o no ser aplicable en su caso.

Ventajas de procesamiento roscado
La ventaja de hacer el trabajo en un hilo separado es que es mucho más simple. La disociación aporta complejidad y costo. La gestión de la obra en un hilo separado, usted no tiene ninguno de los gastos generales de funcionamiento de la gestión de un proceso separado, potencialmente, una máquina separada. No hay ninguna configuración adicional, ningún nuevo paso de generación / distribución. Ninguna copia de seguridad adicional. Sin identidad de seguridad adicional para mantener. Ningún intercambio de comunicación que preocuparse (más allá del despacho de rosca).

Usted puede optar por ser un poco más sofisticado sobre el procesamiento de elemento de trabajo, y, opcionalmente, hacer el trabajo de forma sincrónica cuando el archivo zip se ve lo suficientemente pequeña. Supongamos que se establece un umbral de tiempo de respuesta de 4 segundos - por encima de eso, usted necesita la carga de trabajo asíncrono, por debajo de 4 segundos, lo haces "en línea". Por supuesto, nunca se sabe a ciencia cierta cuánto tiempo un archivo zip tomará, pero couldd establecer una buena heurística basada en el tamaño del archivo. Esta optimización está disponible para usted si se utiliza un proceso externo para el trabajo asíncrono, o un hilo separado, pero para ser honesto, es más sencillo para tomar ventaja de la optimización cuando se utiliza un hilo separado. Menos trabajo adicional para hacer. Así que esto es una ventaja para el enfoque de rosca.

No diferenciadores
Si usted decide tener un mecanismo de sondeo de AJAX para la notificación de estado de elemento de trabajo, tsombrero funcionaría, ya sea con el proceso separado o el hilo separado. No sé cómo lo haría seguimiento de elementos de trabajo, pero me gustaría pensar que cuando se ha completado un determinado elemento de trabajo (archivo zip?), Entonces usted va a actualizar un registro en alguna parte - un archivo en un sistema de archivos, una tabla en una base de datos . Esa actualización se produce si se está haciendo de un hilo en el mismo proceso, o por un proceso separado (servicio de Windows). Por lo que el cliente AJAX que las encuestas se acaba de comprobar la tabla db o sistema de archivos en cualquier caso, y recibirán la notificación de estado de elemento de trabajo de la misma manera, independientemente de su decisión arquitectura.

¿Cómo decidir
La teoría es interesante, pero en última instancia, inútil, sin limitaciones reales de funcionamiento.

carga de trabajo es uno de los elementos clave en el mundo real. Usted no ha dicho qué tan grande estos archivos zip son, pero estoy adivinando que son "tamaño normal". Algo sobre 4gb o menos. Normalmente, un archivo zip como la toma de 20-60 segundos para desempaquetar en mi portátil, pero por supuesto en un servidor con un sistema de almacenamiento real y una CPU más rápida, será menos. También no caracterizó la concurrencia de transacciones - ¿cuántas de estas cosas que va a ocurrir en un momento dado. Estoy asumiendo que la concurrencia no es particularmente alto.

Si ese es el caso, me quedo con el enfoque más simple hilo asíncrono. Usted está haciendo esto en ASP.NET, supongo que en un sistema operativo de servidor. El CLR tiene un buen manejo de hilos, y ASP.NET tiene una buena capacidad de escalado de procesos. Por lo que incluso en altas cargas de trabajo, obtendrá una buena utilización de la CPU y la escala, sin un montón de trabajo de configuración.

Si los elementos de trabajo fueron ya funcionando - digamos del orden de horas o incluso días, y el tiempo era impredecible (como el cierre de un orden de valores) - bien en ese caso yo inclinarse hacia un proceso asíncrono. Si la concurrencia estaba en los miles por segundo, o de nuevo muy impredecible, que también recomiendo un proceso separado. Si los modos de fallo fueron lo suficientemente compleja, puede ser que quiera los elementos de trabajo para estar en un proceso separado sólo para gestionarlo. Si el procesamiento workitem era probable que cambiar regularmente (la adición de un paso adicional, de acuerdo a la evolución de las condiciones de negocio), que podría querer que en un proceso separado.

Sin embargo, ninguna de estas cosas parece ser cierto en su caso - desempaquetar los archivos zip.

Otros consejos

Las desventajas de un hilo separado son:

  1. Cuando la página termina allí hay una manera fácil de conseguir la notificación de lo que el otro hilo está haciendo.
  2. La aplicación podría reiniciarse en cualquier punto.
  3. Sería fácil comenzar accidentalmente el proceso dos veces si el usuario envía la página dos veces en rápida sucesión.
  4. código multiproceso es difícil de depurar.

Las ventajas de un hilo separado son:

  1. Menos código
  2. Fácil de hacer fuego y olvidar si el usuario no tiene que ser notificado cuando el descomprimir completa.
  3. No hay trabajo extra para instalar.

Las ventajas y desventajas de un servicio de Windows son más o menos lo contrario de lo anterior.

En lo personal me gustaría ir por el camino de servicio de Windows con la mensajería entre ellos para el progreso, tales como el retorno de un handle a la de descompresión que puede ser usado para monitorear el estado.

Sin embargo, usted podría también creo que tal vez escindir un hilo para hacerlo y que felizmente va a ejecutar y la página vuelve.

Me gustaría utilizar un proceso asíncrono que puede sondear fácilmente de una página habilitado AJAX. Cuando se haya completado, la parte de la página de AJAX pueden presentar los detalles que normalmente se le han presentado mientras el usuario esperó proceso se complete de forma sincrónica.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top