4 votes

Construire une sécurité intégrée si sunspot-solr n'est pas disponible

Je suis en train de construire une application Rails 3.2 qui utilise la gemme sunspot pour fournir une fonctionnalité de recherche à mon application. sunspot utilise Apache Solr pour effectuer l'indexation et la recherche en texte intégral.

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

Pour l'instant, mon code se contente d'effectuer une recherche chaque fois qu'une personne consulte la page d'index de l'article, puis d'afficher les résultats. Ce qui me préoccupe, c'est que solr s'arrête pour une raison quelconque et mon application disparaît avec elle. Comment puis-je mettre en place une sécurité intégrée pour cette action qui effectue une opération de base de Article.all chaque fois que solr s'effondre ?

Je sais que je pourrais juste rescue de l'exception, mais cela signifierait toujours que chaque demande génère une tentative de connexion à solr . Existe-t-il un moyen d'éviter cela ? (Par exemple, en capturant l'exception une fois et en attendant 5 minutes avant que l'application n'essaie de se reconnecter à l'application solr )

3voto

href_ Points 141

En tant que collaborateur de Sunspot et cofondateur de Websolr Je recommande d'utiliser rescue_from avec un temps mort de faible ampleur.

En ce qui concerne Sunspot, il semble que l'option permettant de spécifier un délai d'attente soit récemment ajouté à RSolr, la bibliothèque utilisée par Sunspot, donc si c'est une fonctionnalité dont vous avez besoin, vous devriez envisager de faire une pull request à Sunspot pour passer un timeout à RSolr.

Générer une requête défaillante à Solr ne devrait pas être très coûteux si vous avez mis en place des délais d'attente appropriés. Si Solr est en panne, vous voulez qu'il temporise lors de l'ouverture de la connexion TCP. Un serveur Solr en bonne santé devrait ouvrir une connexion TCP en moins d'une seconde, et commencer à renvoyer des données en une ou deux secondes au maximum pour les requêtes vraiment coûteuses.

Un délai d'ouverture de 0,1 seconde et un délai de transmission des données de 5 secondes devraient suffire amplement.

La meilleure option est d'avoir un proxy local entre votre application et Solr qui peut limiter les requêtes lorsque Solr est en panne. Peut-être un intergiciel de mise en cache, ou Varnish. Il s'agit certainement d'une approche plus compliquée, à moins qu'un tel proxy ou cache ne fasse déjà partie de l'infrastructure de votre application.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X