Quelle est la situation actuelle des processus de threading, de concurrence et de fourchue dans Ruby on Rails?

StackOverflow https://stackoverflow.com/questions/129226

  •  02-07-2019
  •  | 
  •  

Question

Ruby on Rails ne fait pas très bien les requêtes-réponses multithreads, ou du moins, ActiveRecord ne le fait pas.

La notion d'une seule demande-réponse active à la fois peut être gênante lors de la création d'applications Web générant une commande shell longue à terminer.

Ce que j'aimerais, ce sont certains de vos points de vue sur ce type de configuration? Est-ce que Rails ne convient peut-être pas à certaines applications?

En outre, quel est l’état actuel des choses en matière de concurrence dans Ruby on Rails? Quelles sont les meilleures pratiques. Existe-t-il des solutions de contournement aux lacunes?

Était-ce utile?

La solution

Rails ne gère actuellement pas les demandes simultanées dans le cadre d’un processus Ruby MRI (Matz Ruby Interpreter). Chaque demande est essentiellement emballée avec un mutex géant. La prochaine version de Rails 2.2 est sans danger pour les threads, mais vous n’en tirerez pas grand avantage en utilisant Ruby 1.8x. Je ne peux pas dire si Ruby 1.9 sera différent parce que je ne le connais pas très bien, mais je ne l'aurais probablement pas pensé.

Un domaine qui semble très prometteur à cet égard est l'utilisation de Rails avec JRuby, car la machine virtuelle Java est généralement reconnue comme étant performante en multi-threading. Arun Gupta de Sun Microsystems a donné une chiffres de performances intéressants sur cette configuration de RailsConf Europe récemment.

Autres conseils

Neverblock permet de ne pas bloquer les fonctionnalités sans modifier la façon dont vous écrivez les programmes. C’est vraiment un projet passionnant qui a été rétroporté pour travailler sur Ruby 1.8.x (qui repose sur les fibres de Ruby 1.9). Cela fonctionne à la fois avec PostgreSQL et MySQL pour effectuer des requêtes non bloquantes. Les points de repère sont loufoques ...

Ruby 1.8 de Matz utilise les fils verts , et le Ruby 1.9 de Matz utilisera un système d'exploitation natif les discussions. D'autres implémentations de Ruby 1.8, telles que JRuby et IronRuby, utilisent des threads O / S natifs. YARV, raccourci pour Yet Another Ruby VM, utilise également des threads O / S natifs, mais dispose d'un verrou d'interpréteur global pour garantir qu'un seul thread Ruby est en cours d'exécution à un moment donné.

Si ce que vous exécutez sur le shell n'est pas nécessaire pour le rendu de la page (par exemple, vous ne déclenchez que des tâches de maintenance), vous devez les démarrer en tant que processus en arrière-plan. Découvrez starling et workling.

Si cela ne s'applique pas à votre situation, vous devrez vous assurer que plusieurs instances de vos serveurs d'applications s'exécutent. Traditionnellement, les gens commençaient plusieurs instances de Mongrel. Mais maintenant, je dirais que le moyen le plus simple d’avoir une configuration solide est de loin d’utiliser Phusion Passenger . C'est un module Apache qui vous permet de spécifier facilement le nombre d'instances (min et max) de vos serveurs d'applications que vous souhaitez faire fonctionner. Le passager fait le reste. Et si je me souviens bien, cela ne fait pas de round robin stupide pour l’envoi de demandes. Je pense que c'est par disponibilité.

Ruby 1.9 ajoute des fibres légères:

http://www.infoq.info/news / 2007/08 / ruby-1-9-fibres

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top