Rails 3.2: предварительный рендеринг (запекание) нового кэша страниц сразу после истечения срока его действия? - PullRequest
3 голосов
/ 24 февраля 2012

У меня есть приложение, которое использует caches_page для определенных контроллеров / действий.Для истечения срока действия кеша я использую подметальную машину.В общем, это стандартное решение.

Тем не менее, поскольку некоторые изменения могут привести к небольшому потоку запросов на сервере (потому что push-уведомления отправляются и могут запускать клиентские устройства для получения новых данных),Я хотел бы иметь возможность предварительно визуализировать кэш, чтобы он был готов до того, как запросы будут добавлены. Конечно, я мог бы просто подождать, пока первый запрос автоматически запишет кэш, но в этом случае я знаю что запросы придут, что их может быть много, и что они могут быть почти одновременными.Поэтому я хотел бы, чтобы кэш был готов.

Чтобы добавить некоторую сложность, обновления выполняются через обычную веб-страницу и обрабатываются в стандартном, в основном скаффолдинговом контроллере, тогда как «страницу» я хочу кешировать.является ответом JSON для совершенно другого контроллера, который служит в качестве API.

Итак, как мне из уборщика (или из контроллера, обрабатывающего обновление с истекающим сроком кэша) запустить новый кэш страницыбыть написанным немедленно?

Другой способ выразить это может быть: Как сделать внутренний запрос от одного контроллера к другому?


Редактировать: Закончилось что-то делатькак то, что вы видите ниже.Это не очень элегантно, но эффективно

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

1 Ответ

2 голосов
/ 24 февраля 2012

Прогрев кеша сервера может выходить за рамки логики вашего приложения. Я реализовал систему подогрева кеша перед тем, как использовать задачу rake, которая обернула команду curl и перебрала все области на сайте.

# lib/tasks/curl.rake
desc "curl"
task :curl do
  paths.each do |path|  
  `curl #{path}`
  end
end

Вы можете вызвать эту задачу, выполнив "rake curl" из корня вашего проекта Rails.

Кроме того, вы можете вызывать эту задачу rake (которая оборачивает curl) изнутри вашего метода sweeper после истечения срока действия кэша. Посмотрите, что Railscast Райан Бейтс делал при вызове граблей в фоновом режиме из кода приложения Rails: http://railscasts.com/episodes/127-rake-in-background

Больше информации о скручивании здесь: http://curl.haxx.se/docs/manpage.html

...