Rails 3.2: ¿Pre-renderizar (hornear) una nueva caché de página inmediatamente después de su vencimiento?
Tengo una aplicación que usacaches_page
para ciertos controladores / acciones. Para caducar el caché, uso una barredora. En general, es una solución estándar.
Sin embargo, debido a que algunos cambios pueden causar un poco de solicitudes en el servidor (debido a que se envían notificaciones push y pueden hacer que los dispositivos del cliente obtengan nuevos datos), me gustaría poder renderizar previamente el caché, así que está listo antes de que lleguen las solicitudes. Podría esperar a que la primera solicitud escriba automáticamente el caché, por supuesto, pero en este caso, yosabe que llegarán las solicitudes, que podría haber muchas y que podrían ser casi simultáneas. Entonces me gustaría tener el caché listo.
Para agregar algo de complejidad, las actualizaciones se realizan a través de una página web normal y se manejan en un controlador estándar, en su mayoría andamio, mientras que la "página" que quiero almacenar en caché es la respuesta JSON para un controlador completamente diferente que sirve como API.
Entonces, ¿cómo puedo, desde un barrendero (o desde el controlador que maneja la actualización de caducidad de caché) activar una nueva caché de página para que se escriba de inmediato?
Otra forma de expresarlo podría ser: ¿Cómo hago una solicitud interna de un controlador a otro?
Edit: Terminé haciendo algo como lo que ves a continuación. No es terriblemente elegante, pero es efectivo
class ModelSweeper < ActionController::Caching::Sweeper
observe Model
def after_create(model)
expire_pages_for(model)
end
def after_update(model)
expire_pages_for(model)
end
def after_destroy(model)
expire_pages_for(model)
end
protected
def expire_pages_for(model)
# expire index page
expire_and_bake(models_url)
# expire show page
expire_and_bake(model_url(model))
end
def expire_and_bake(url)
# extract the path from the URL
path = url.sub(%r{\Ahttp://[^/]+}, "")
# expire the cache
expire_page(path)
# request the url (writes a new cache)
system "curl '#{url}' &> /dev/null &"
end
end