2011-11-17 9 views
12

Estoy usando Impressionist para registrar impresiones de página. La escritura de la base de datos solo lleva unos 50 ms, pero preferiría hacerlo una vez que la página haya procesado y enviado al cliente.Cómo realizar alguna tarea después de renderizar en Rails 3.1

He buscado en bifurcación a través de Spawn, pero establece una nueva conexión de base de datos, que parece ser demasiado para un trabajo tan pequeño. Retraso en el trabajo y otras bibliotecas de procesamiento en segundo plano parecen mayor overkill. Escribir en la base de datos solo para diferir la escritura en la base de datos ... no es una victoria.

me gustaría poder simplemente:

def show 
    render 
    impressionist(@article) 
end 

... y tienen impresionista haga su trabajo con la misma conexión de base de datos y todos los mismos datos de la solicitud como la acción, justo después de la acción ya ha vuelto a la cliente. Pero, por supuesto, no es así como funciona el método de renderizado.

¿Alguna solución? Running Rails 3.1 y Ruby 1.9.2 en Heroku Cedar.

+4

esto es más difícil de lo que piensas :) inspirate desde aquí: http://www.perfectline.ee/blog/ruby-on-rails-before-render-filter – apneadiving

Respuesta

0

¿Qué hay de iniciar sesión en algo un poco más rápido como mongodb, o podría considerar almacenar un hash en redis (ultra rápido) y tener un trabajo por lotes cada hora para almacenarlos en su base de datos postgres. Con estas dos opciones, deberás hackear Impresionista o rodar tu propia solución que, como sugeriste con las soluciones en segundo plano (retraso de trabajo, resque, etc.) puede ser exagerada dependiendo del tamaño de tu proyecto.

1

Hay una muy buena railscast sobre el uso de Rescue para exactamente esto, pero estoy bastante seguro de que también implica bifurcación, como lo hacen todos los otros métodos que he visto.

6

Generar un nuevo hilo. Heroku te permitirá hasta 15 hilos por dyno.

def show 
    render 
    Thread.new do 
    impressionist(@article) 
    end 
end 
+1

El punto era, quería que el proceso estuviera disponible para una nueva solicitud. Con un hilo, o tiene que thread.join o el hilo termina cuando finaliza el proceso. – jasongarber

1

Este llegó y parece prometedor: https://github.com/brandonhilkert/sucker_punch

de Brandon un tipo sólido. No puedo esperar para probar Sucker Punch!

+0

Sucker Punch es una gema muy ligera (el trabajo pesado se realiza en celuloide), fácil de asimilar. No le proporciona una IU de administrador ni nada, pero hace lo que anuncia. La mayoría de los sitios web no necesitan múltiples servidores, pero el multihilo + CoW es útil en un entorno VPS. Es una buena forma de iniciar el procesamiento en segundo plano sin problemas. – julian7

0

Creo que se puede utilizar la función de devolución de llamada after_filter

class ApplicationController < ActionController::Base 

    after_filter :after_filter_cb 

    def after_filter_cb 
    # Some logic 
    end 

end 
1

En lo personal, yo no recomendaría el lanzamiento de "Mensajes nuevos" de acción y luego pasar a la referencia subproceso de fondo para el elemento (s) que aún se manipula de otro hilo. Esto lleva muy rápidamente a desagradables errores no reproducibles debido a conflictos entre hilos.