¿Cómo manejar de manera confiable los archivos cargados periódicamente por un agente externo?

StackOverflow https://stackoverflow.com/questions/622392

Pregunta

Es un escenario muy común: algunos procesos desean colocar un archivo en un servidor cada 30 minutos más o menos. Simple, ¿verdad? Bueno, puedo pensar en varias formas en que esto podría salir mal.

Por ejemplo, procesar un archivo puede tomar más o menos de 30 minutos, por lo que es posible que llegue un nuevo archivo antes de que termine con el anterior. No quiero que el sistema de origen sobrescriba un archivo que todavía estoy procesando.

Por otro lado, los archivos son grandes, por lo que lleva unos minutos terminar de cargarlos. No quiero comenzar a procesar un archivo parcial. Los archivos solo se transfieren con FTP o sftp (mi preferencia), por lo que el bloqueo a nivel del sistema operativo no es una opción.

Finalmente, necesito mantener los archivos por un tiempo, en caso de que necesite inspeccionar manualmente uno de ellos (para depurar) o reprocesar uno.

He visto muchos enfoques ad-hoc para mezclar archivos de carga, intercambiar nombres de archivos, usar sellos de fecha, tocar " indicador " archivos para ayudar en la sincronización, etc. Lo que no he visto todavía es un algoritmo " comprensivo " " para procesar archivos que abordan la concurrencia, la coherencia y la integridad.

Entonces, me gustaría aprovechar la sabiduría de las multitudes aquí. ¿Alguien ha visto una forma realmente a prueba de balas para hacer malabarismos con los archivos de datos por lotes para que nunca se procesen demasiado pronto, nunca se sobrescriban antes de hacerlo y se guarden de manera segura después del procesamiento?

¿Fue útil?

Solución

La clave es hacer el malabarismo inicial al final de enviar . Todo lo que el remitente debe hacer es:

  1. Almacene el archivo con un nombre de archivo único.
  2. Tan pronto como el archivo haya sido enviado, muévalo a un subdirectorio llamado, por ejemplo, completado .

Suponiendo que hay un solo proceso de receptor, todo lo que el receptor debe hacer es:

  1. Escanee periódicamente el directorio completed en busca de archivos.
  2. Tan pronto como aparezca un archivo en completado , muévalo a un subdirectorio llamado p. procesado , y comience a trabajar desde allí.
  3. Opcionalmente elimínelo cuando haya terminado.

En cualquier sistema de archivos sano, los movimientos de archivos son atómicos siempre que se produzcan dentro del mismo sistema de archivos / volumen. Así que no hay condiciones de carrera.

Múltiples receptores

Si el procesamiento puede demorar más que el período entre la entrega de los archivos, acumulará una acumulación de pedidos a menos que tenga varios procesos de receptor. Entonces, ¿cómo manejar el caso de múltiples receptores?

Simple: cada proceso del receptor funciona exactamente como antes. La clave es que intentamos mover un archivo a procesado antes de trabajar en él: eso, y el hecho de que el mismo sistema de archivos se mueva son atómicos, lo que significa que incluso si es múltiple los receptores ven el mismo archivo en completado y tratan de moverlo, solo uno tendrá éxito. Todo lo que necesita hacer es asegurarse de verificar el valor de retorno de rename () , o cualquier llamada del sistema operativo que use para realizar el movimiento, y solo continúe con el procesamiento si tuvo éxito. Si el movimiento falló, algún otro receptor llegó primero, así que simplemente regrese y escanee el directorio completado nuevamente.

Otros consejos

Si el sistema operativo lo admite, use los enlaces del sistema de archivos para interceptar las operaciones de abrir y cerrar archivos. Algo así como Dazuko . Otros sistemas operativos pueden informarle acerca de las operaciones de archivos de una manera diferente, por ejemplo, Novell Open Enterprise Server le permite definir épocas, y lee lista de archivos modificados durante una época.

Me di cuenta de que en Linux, puede usar el subsistema inotify o las utilidades del paquete inotify-tools

La transferencia de archivos es uno de los clásicos de la integración del sistema. Le recomiendo que obtenga el libro Patrones de integración empresarial para crear su propia respuesta a estas preguntas: Hasta cierto punto, la respuesta depende de las tecnologías y plataformas que esté utilizando para la implementación del punto final y para la transferencia de archivos. Es una colección bastante completa de patrones viables y bastante bien escrita.

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