Tengo un bookmarklet que, cuando se usa, envía todas las URL en la página actual del navegador a una aplicación de Rails 3 para su procesamiento. Detrás de escena estoy usando Typhoeus para verificar que cada URL devuelva un código de estado 2XX. Actualmente inicio este proceso a través de una solicitud de AJAX al servidor Rails y simplemente espero mientras procesa y devuelve los resultados. Para un conjunto pequeño, esto es muy rápido, pero cuando el número de URL es bastante grande, el usuario puede esperar hasta, por ejemplo, 10-15 segundos.¿Práctica recomendada para procesar una gran cantidad de datos mientras el usuario espera (en Rails)?
He considerado utilizar el trabajo diferido para procesar esto fuera del hilo del usuario, pero este no parece el caso de uso correcto. Dado que el usuario debe esperar hasta que finalice el procesamiento para ver los resultados, y el Trabajo diferido puede demorar hasta cinco segundos antes de que el trabajo se inicie, no puedo garantizar que el procesamiento se realice lo antes posible. Este tiempo de espera no es aceptable en este caso, lamentablemente.
Idealmente, lo que creo que debería suceder es lo siguiente:
- usuario pulsa bookmarklet
- Los datos se envían al servidor para su procesamiento
- Una página de espera se devuelve al instante, mientras que la escisión de un hilo que hacer el procesamiento
- La página de espera sondea periódicamente a través de ajax los resultados del procesamiento y actualiza la página de espera (por ejemplo: "4 de 567 URL procesadas ...")
- la página de espera se actualiza con los resultados una vez que estén listos
Algunos detalles adicionales:
- estoy usando Heroku (procesos de larga ejecución mueren al cabo de 30 segundos)
- Tanto iniciado la sesión y los usuarios anónimos pueden use esta característica
¿Es esta una forma típica de hacer esto, o hay una manera mejor? ¿Debo simplemente rodar mi propio proceso fuera de subproceso que actualiza la base de datos durante el procesamiento o hay algo así como el trabajo diferido que puedo utilizar para esto (y que funciona en Heroku)? Cualquier empuje en la dirección correcta sería muy apreciado.
¿Qué hiciste al final? – Ari
@Ari Ha pasado mucho tiempo desde que trabajé en esto, pero en general usé un procesador de fondo (usaría sidekiq hoy) junto con una máquina de estado que rastreaba el progreso. Luego, acabo de sondear usando xhr en la interfaz hasta que el estado esté "completo" o lo que sea que necesite. – markquezada
Gracias. ¿Entonces supongo que Thread.new no funcionaría solo? – Ari