Какой наиболее эффективный способ получения данных одного приложения rails другим приложением rails?

#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 здесь…