2012-02-03 4 views
4

현재 응용 프로그램에 검색 기능을 제공하기 위해 sunspot gem을 사용하는 Rails 3.2 응용 프로그램을 빌드 중입니다. sunspot은 Apache Solr을 사용하여 전체 텍스트 인덱싱 및 검색을 수행합니다.sunspot-solr을 사용할 수없는 경우 failsafe를 구축하십시오.

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이 웬일인지 내려 가고 내 앱이 그걸로 죽는다는 것입니다. solr이 다운 될 때마다 Article.all을 수행하는이 작업에 대한 안전 장치를 어떻게 구현할 수 있습니까?

예외에서 나는 단지 rescue을 알 수 있지만 모든 요청이 solr으로의 연결 시도를 생성한다는 것을 알고 있습니다. 이것을 막을 수있는 방법이 있습니까? (예를 들어, 한 번 예외를 잡기 앱이 solr에 다시 연결을 시도하기 전에 5 분간 대기) 태양 흑점에 기여하고 Websolr의 공동 설립자로

답변

3

, 나는 저 분에 타임 아웃 rescue_from를 사용하는 것이 좋습니다.

Sunspot은 Sunspot이 사용하는 라이브러리 인 RSolr에 대한 시간 제한을 recently added으로 지정하는 것처럼 보이므로이 기능이 필요한 경우 Sunspot에 풀 요청을 보내면 RSolr에 대한 시간 초과.

적절한 시간 초과가있는 경우 Solr에 대한 요청 실패는 비용이 많이 들지 않습니다. Solr이 다운되면 TCP 연결을 여는 데 시간 초과가 발생하기를 원합니다. 건강한 Solr 서버 은 1 초도 안되는 순서로 TCP 연결을 열고 정말로 값 비싼 쿼리의 경우 2 초 또는 2 초 이내에 데이터를 다시 보내기 시작해야합니다.

오픈 타임 아웃 0.1 초 및 데이터 타임 아웃 5 초가 충분해야합니다.

다음으로 가장 좋은 옵션은 Solr이 다운되었을 때 요청을 조절할 수있는 응용 프로그램과 Solr 사이에 다른 로컬 프록시를 갖는 것입니다. 아마도 캐싱 미들웨어 또는 광택. 물론 프록시 나 캐시가 이미 애플리케이션의 인프라 스트럭처에 포함되어 있지 않다면 좀 더 복잡한 접근 방식으로 볼 수있을 것입니다.

+1

고 가용성 옵션에 대해 설명합니다. – aitchnyu

+0

잘 설명하고 많은 도움이됩니다! 감사. – halfdan

+0

나는'sunspot'을 포크로 막아서 타임 아웃을 설정할 수 있었지만, 다음 커밋을 발견했습니다. https://github.com/sunspot/sunspot/commit/abc3b472c917cea50e6e5ace813a4d13ad1ac08a 이미 구현되었습니다. 좋은! – halfdan

관련 문제