Создайте отказоустойчивый, если sunspot-solr недоступен - PullRequest
4 голосов
/ 03 февраля 2012

В настоящее время я создаю приложение Rails 3.2, которое использует gem sunspot, чтобы обеспечить функциональность поиска для моего приложения.sunspot использует Apache Solr для выполнения полнотекстовой индексации и поиска.

def index
    @search = Article.search do
      fulltext params[:search]
      with(:published_at).less_than(Time.zone.now)
      paginate :page => params[:page], :per_page => 10
      facet(:published_month)
    end
    @articles = @search.results

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @articles }
    end
end

Прямо сейчас мой код просто выполняет поиск каждый раз, когда кто-то переходит на страницу индекса статьи, а затем отображает результаты.Меня беспокоит то, что solr по какой-то причине отключается, и мое приложение умирает вместе с ним.Как я могу реализовать отказоустойчивый для этого действия, которое выполняет базовый Article.all всякий раз, когда solr выходит из строя?

Я знаю, что я мог бы просто rescue из исключения, но это все равно означало бы, что каждый запросгенерирует попытку подключения к solr.Есть ли способ предотвратить это?(Например, перехватить исключение один раз и подождать 5 минут, прежде чем приложение попытается повторно подключиться к solr)

1 Ответ

3 голосов
/ 04 февраля 2012

Как участник Sunspot и соучредитель Websolr , я рекомендую использовать rescue_from с небольшим таймаутом.

Что касается Sunspot, похоже, что опция для указания таймаута была недавно добавлена ​​ в RSolr, библиотека Sunspot использует, так что если это функция, которая вам нужна, вы должны рассмотреть возможность добавления просьба к Sunspot передать тайм-аут в RSolr.

Генерирование ошибочного запроса к Solr не должно быть таким дорогим, если у вас установлены правильные тайм-ауты. Если Solr не работает, вы хотите, чтобы время открытия TCP-соединения истекло. Работоспособный сервер Solr должен открыть TCP-соединение на порядок меньше секунды и начать отправку данных обратно не более чем через секунду или две для действительно дорогих запросов.

Время ожидания открытия в 0,1 секунды и время ожидания данных в 5 секунд должно быть более чем достаточно.

Следующий лучший вариант здесь - это иметь какой-то другой локальный прокси между вашим приложением и Solr, который может регулировать запросы, когда Solr не работает. Возможно промежуточное программное обеспечение для кэширования или Varnish. Конечно, я бы воспринял это как более сложный подход, если такой прокси или кеш уже не является частью инфраструктуры вашего приложения.

...