2011-02-07 1 views
2

Je construis un Facebook app called Lovers, en utilisant un Sinatra app on Heroku. Il fonctionne sur Ruby 1.9.2 sur Heroku's bamboo-mri-1.9.2 stack.Existe-t-il une instance d'application Rack par requête HTTP?

Il est un modular Sinatra app, et dans le Lovers source code, je donne chaque instance de l'application Sinatra (Lovers::Application) une instance de Facebook::Application:

require 'sinatra/base' 

class Lovers::Application < Sinatra::Base 
    attr_reader :facebook 

    def initialize(app=nil) 
    @facebook = Facebook::Application.new(
     Lovers::Conf.fb_app_id, 
     Lovers::Conf.fb_app_secret, 
     Lovers::Conf.fb_canvas_name) 
    super(app) 
    end 
    # ... 
end 

De cette façon, vous pouvez faire Lovers.application.facebook pour accéder au Facebook::Application exemple de n'importe où dans le module Lovers, disons de Lovers::User.

-t-il un sens, ou devrais-je avoir juste tous les cas de Lovers::Application (si jamais il y a plus d'un) partagent la même Facebook::Application instance, à savoir Lovers.facebook. C'est ce que nous faisons pour Redis: Lovers.redis, ce qui est logique pour moi. Je suppose que je penche pour le changer pour le dernier, mais je veux m'assurer avant de le changer. Qu'est-ce que tu penses?

Enfin, y a-t-il une instance de Lovers::Application par requête HTTP?

MISE À JOUR:

J'ai lu sur Heroku Dynos. Apparemment, chaque dyno (processus) exécute une instance de Lovers::Application. Donc, après avoir lu environ sharing a global variable among processes, je pense que si je définis une variable de classe @@hit_count dans la classe Lovers::Application, elle aura des valeurs différentes selon le dyno qui reçoit la requête, en supposant que j'augmente @@hit_count chaque fois que la page d'accueil est demandée, c.-à-d. :

@@hit_count = 0 

    get "/" do 
    @@hit_count += 1 
    end 

Répondre

2

"Enfin, existe-t-il une instance de Lovers :: Application par requête HTTP?"

Il existe une instance par processus/dyno.

« il aura des valeurs différentes selon lesquelles Dyno reçoit la demande, en supposant que j'incrémenter @@ hit_count à chaque fois que la page d'accueil est demandé »

oui, si vous avez besoin état global que vous devez garder l'état extérieur de votre processus/dyno. Il existe plusieurs façons de procéder, et celles que vous choisirez dépendront des détails de votre application et de vos niveaux de trafic. Si vous n'obtenez pas beaucoup de trafic, vous pouvez faire quelque chose d'aussi simple que de le conserver dans votre base de données. Vous pouvez faire des incréments atomiques dans postgres ou mysql pour quelque chose comme hit_count. Cependant, cette approche peut devenir un goulot d'étranglement si vous avez beaucoup de trafic.

+0

Pouvez-vous élaborer sur quelques idées possibles pour garder l'état en dehors du processus? J'essaie de trouver une bonne solution pour le moment qui évite de stocker la valeur dans la base de données - quelque chose qui ne tombera pas dans un environnement à fort trafic. merci –

+0

redis ou memcahe – jshen

Questions connexes