2013-04-23 7 views
1

У меня есть огромная страница, которую я кэширую с помощью команды rails caches_page. Перед созданием кеша первый HTTP-запрос занимает около 30 секунд для создания кеша. Я хотел бы избежать этого, так что первый пользователь, попавший на страницу, может загружать его намного быстрее.Программно генерировать кеш с Rails

Я пытаюсь создать кэш программно с помощью HTTP, но это не похоже на работу:

uri = URI.parse("http://mydomain.com/huge_page") 

http = Net::HTTP.new(uri.host, uri.port) 
request = Net::HTTP::Get.new(uri.request_uri) 

response = http.request(request) 

То, что я получил в ответ ошибка тайм-аут:

Timeout::Error (execution expired) 

ли вам есть какое-то предложение, как я могу это сделать?

ответ

1

Если вы пытаетесь сгенерировать кеш посредством HTTP-запроса, вам нужно убедиться, что вы не делаете этот запрос в контексте вашего первоначального запроса. Это означает, что страница будет запрашивать себя.

Если вы это делаете, и у вас есть только один поток или сервер, на котором запущено приложение, он никогда не сможет выполнить запрос и будет тайм-аут. Это происходит потому, что действие не будет завершено до тех пор, пока оно не закончит часть response = http.request(request). Однако ваш сервер не сможет ответить, потому что он находится в середине действия.

Однако, все это означает, что вы должны действительно никогда. ни при каких обстоятельствах не имеет запроса, который так долго загружается. Все, что занимает более одной секунды (или в процессе производства, например, 200 мс), должно быть перемещено в рабочий с задержкой :: Работа или аналогичная фоновая очередь.

Не зная подробностей вашего приложения, я настоятельно рекомендую придумать способ создания страницы намного быстрее, чем полагаться на кеширование здесь.

+0

Кэшированная версия этой страницы очень быстрая (менее 200 мс), она просто вычислительно сложна для запросов, которые она делает при первом запуске. Я не думаю, что Delayed :: Job может помочь мне на этот раз. –

+0

Как насчет исходного пункта о том, что у вас есть один поток/процесс, можете ли вы одновременно обслуживать несколько запросов? – Kris

+0

Да, я создал 4 рабочих, чтобы было возможно одновременно обслуживать несколько запросов. –

Смежные вопросы