#ruby-on-rails #ruby-on-rails-3 #performance #ruby-on-rails-3.1
#ruby-on-rails #ruby-on-rails-3 #Производительность #ruby-on-rails-3.1
Вопрос:
У меня есть два приложения rails (оба теперь на Rails 3.1.1), и они работают хорошо. Однако у меня есть зависимость между ними. Приложение A
использует данные приложения B
, связываясь с ним. Эти ссылки создаются автоматически, но они должны быть вычислены путем поиска данных приложения B
. Я работаю над Windows 7 с Ruby 1.9.2 и Thin as web server, и это не будет изменено:-(
Я попробовал следующее:
- Используйте только ресурс RESTful, поэтому определил контроллер, вызвал его действие (
get_xml_obj
с некоторыми параметрами в нем), прочитал необходимые значения из XML. Работает, но требуется от 0,5 с до 1 с на вызов. - Заменил его на ActiveResource#find, который также работал, но с той же производительностью, что и предыдущее решение.
- Я установил nginx и настроил его так, чтобы соединение оставалось постоянным, так что обработка соединения должна быть намного быстрее. Но не заметил никакой разницы при вызове
B
изA
.
Когда я сравниваю затраченное время, это типичные примеры (здесь с 4 ссылками на одной веб-странице):
Приложение А:
Started GET "/tasks/search_task/1803" for 127.0.0.1 at 2011-11-02 14:11:04 0100
Processing by TasksController#search_task as HTML
Parameters: {"id"=>"1803"}
Rendered tasks/_tooltip.html.haml (4529.5ms)
Completed 200 OK in 4532ms (Views: 4527.5ms | ActiveRecord: 2.0ms)
cache: [GET /tasks/search_task/1865] miss
Приложение B:
cache: [GET /service/get_xml_obj?key=noticeamp;value=rails] miss
Started GET "/service/get_xml_obj?key=noticeamp;value=rails" for 127.0.0.1 at 2011-
11-02 14:11:05 0100
Processing by ServiceController#get_xml_obj as */*
Parameters: {"key"=>"notice", "value"=>"rails"}
Completed 200 OK in 6ms (Views: 3.0ms | ActiveRecord: 1.0ms)
и 3 других вызова с аналогичной длиной (<10 мс).
Итак, могу ли я что-нибудь сделать для настройки извлечения (без прямого доступа к базе данных)? Знаете ли вы какую-нибудь хорошую документацию о том, как измерить и настроить веб-сервер и промежуточное программное обеспечение? Это только персональные приложения, поэтому их невозможно развернуть на приличном сервере. Я использую кеш для извлеченной информации, поэтому со временем он улучшается, но 1 секунда — это слишком много, чтобы ждать. И на странице, которую я хочу отобразить, может быть более 1 или 2 ссылок.
Комментарии:
1. Разве вы не можете перейти непосредственно к базе данных?
2. Возможно, я смогу (будет следующей попыткой повысить производительность). Но у него есть некоторые недостатки: 2 подключения к базе данных, дублирование множества объектов модели. И, конечно, я хотел бы видеть, что доступно эффективное решение Rails.
3. Поместите общие модели в плагин / gem.
Ответ №1:
Хорошо, я, наконец, сдался и реализовал следующее:
- Добавлен файл
b.rb
в мойmodels
каталог в приложенииA
. - Включены все необработанные модели, где базовые модели (используемые sti) определены следующим образом:
class Notice < ActiveRecord::Base self.establish_connection( :adapter => "sqlite3", :database => "../b/db/dev.db" ) end ...
- Теперь я могу спросить:
Notice.where(:key => 'rails')
что приводит к созданию реального объекта модели Rails.
Все это было реализовано примерно за 20 минут, и теперь нет никакой разницы в том, чтобы не включать ссылку из приложения A
B
, чтобы включить 5 ссылок.
В какой-то момент времени я хотел бы знать, что является медленной частью использования ресурсов RESTful здесь…