2010-11-01 8 views
1

La plupart d'une application Web est assez standard CRUD. J'ai besoin de données à transmettre aux clients en direct à mesure qu'ils sont créés. Vaut-il la peine d'exécuter une pile séparée et plus légère (comme Sinatra ou EventMachine) pour l'AJAX? Si je cours une pile, j'aurai le surcoût de Rails. Cela peut nécessiter plus de processus/serveurs Rails, alors comment communiquer entre ceux-ci sans requêtes de base de données? ZeroMQ? Enfin, Rails est-il adapté pour gérer des centaines de connexions simultanées?AJAX et Rails: deux piles ou une?

Si j'exécute deux piles, j'ai besoin de dupliquer la logique d'autorisation.

Quelles méthodes ont été couronnées de succès pour vous?

+0

Il y a plusieurs questions ici. Il pourrait être intéressant pour vous d'exprimer votre préoccupation. Avez-vous un problème de mise à l'échelle ou est-ce quelque chose que vous pensez avoir un problème avec? De toute évidence, certains ont mis à l'échelle les applications Rails, mais comme toute autre technologie, vous devez être intelligent pour que les choses fonctionnent bien. –

Répondre

1

Dans Rails 3, vous pouvez facilement vous connecter aux applications Rack en utilisant la nouvelle syntaxe de routage et en héritant vos contrôleurs de ActionController::Metal ou en définissant simplement self.call. Avoir un read (ou regarder) de Railscast # 222 et vérifier wycats' blog (voir ci-dessous pour des exemples d'extraits).

Vous êtes déjà au courant des cas supplémentaires que vous devrez gérer si vous descendez cette piste, alors assurez-vous que c'est nécessaire avant de vous y coincer. Il est généralement moins coûteux d'abandonner $ sur les serveurs que sur les programmeurs - le matériel et la bande passante sont assez bon marché.

Personnellement, je pense que cela tombe sous «l'optimisation prématurée» à moins que votre application est déjà en cours d'exécution et étouffement avec trop de trafic.


Quelques exemples: belles

# config/routes.rb 
# Hook in Sinatra 
root :to => HomeApp 
# Write your own barebones Rack compatible code 
match "/processes" => ProcessesApp 
# Even specify an inline proc 
match "/heartbeat", :to => proc {|env| [200, {}, ["App is running"]] } 

# /lib/home_app.rb 
class HomeApp < Sinatra::Base 
    get "/" do 
    "Hello from Sinatra" 
    end 
end 

# lib/processes_app.rb 
class ProcessesApp 
    def self.call(env) 
    [200, {}, [`ps -axcr -o "pid,pcpu, pmem, time, comm"`]] 
    end 
end