2012-08-06 11 views
7

Sto passando la configurazione di una sessione dell'applicazione Pyramid da cookie a ext:memcached. La mia applicazione è ospitata su Heroku e ho configurato il loro memcache addon come da their documentation.Dovrei configurare `session.lock_dir` di Beaker quando si usa Memcache su Heroku?

Capisco dallo Beaker documentation che la specifica di session.lock_dir è essenziale per impedire dog pile effect. Per essere esplicito: devo fornire un percorso di file a una directory. Beaker utilizza quindi questo come un tipo di blocco per impedire a più client che tutti cercano di impostare lo stesso valore allo stesso tempo.

Per me, questo suona come una cattiva architettura. Uno dei principali vantaggi di memcache è che funziona come servizio esterno condiviso. Associare i miei processi applicativi a un blocco associato al disco sembra l'approccio sbagliato.

Allo stesso modo, su Heroku, ho un file system ephemeral per "dyno" (che intendo per significato per processo). Quindi, mentre posso fornire un percorso di directory lock_dir, se ogni processo utilizza una directory diversa, questo mi proteggerà dall'effetto pila di cani?

io non sono sicuro se dovrei:

  • specificare un lock_dir e non preoccuparti
  • tentativo di sborsare Beaker e la patch questo in qualche modo

Inoltre mi piacerebbe sapere quale schema usano altri linguaggi/framework qui. Questo è solo un problema di Beaker o altre configurazioni non legate a file soffrono dell'effetto pila di cani?

Grazie in anticipo,

James.

+0

Sono abbastanza sicuro che il backend di memcached non richiede un 'lock_dir', l'hai provato senza? –

+0

Ciao Michael, 'beaker.ext.memcached' richiede un lock_dir, quando si usa uno qualsiasi dei backend oltre a' memory' o 'cookie'. [Il mio traceback qui] (https://raw.github.com/gist/3278155/d744c1087445b5c18270212796026dbafe9b5760/gistfile1.pytb). – thruflo

+1

Scusa, il mio ultimo commento non ha avuto senso. Il back-end memcached richiede un 'lock_dir'. Il traceback che ho postato è attivato da [questo codice] (https: // bitbucket.org/bbangert/bicchiere/src/d1757ad53763/bicchiere/ext/memcached.py cl-85 #). Mi sono imbattuto in [questa discussione sullo stesso problema] (https://bitbucket.org/bbangert/beaker/issue/78/clusterable-session). Sembra che la risposta sia: "specifica un lock_dir e non preoccuparti". – thruflo

risposta

0

Sfortunatamente, secondo la mia esperienza, Beaker non funziona bene sull'infrastruttura multihost a causa dell'assenza di blocco distribuito. Se si utilizza il beaker nell'app Web in esecuzione su 2 host, l'effetto pila di cani si verifica ancora (tuttavia può essere evitato attaccando tutte le richieste dallo stesso utente a un server, ma non funziona su tutte le piattaforme).

A volte si può semplicemente ignorare l'effetto pila di cani, a volte no. Per esempio. se si memorizzano nella cache dati globali, l'effetto pila di cani è dolore. Se si memorizzano nella cache i dati utente, è possibile ignorarli a volte.

Nel tuo caso, lo ignorerei. Beakers ti consente di usare l'estensione Memcache senza alcuna dir lock. In questo caso, i blocchi Beaker funzionano per processo usando solo i blocchi di thread.

Qui è la prova:

from beaker.middleware import SessionMiddleware 
from werkzeug.wrappers import Response 
from werkzeug.serving import run_simple 


def simple_app(environ, start_response): 
    # Get the session object from the environ 
    session = environ['beaker.session'] 

    # Check to see if a value is in the session 
    user = 'user_id' in session 

    # Set some other session variable 
    session['user_id'] = 10 
    session.save() 

    start_response('200 OK', [('Content-type', 'text/plain')]) 
    return ['User is logged in: %s' % user] 

# Configure the SessionMiddleware 
session_opts = { 
    'session.type': 'ext:memcached', 
    'session.url': '127.0.0.1:11211', 
    'session.auto': True, 
    'session.cookie_expires': True, 
} 
wsgi_app = SessionMiddleware(simple_app, session_opts) 


if __name__ == '__main__': 
    run_simple('127.0.0.1', 5000, wsgi_app, use_debugger=True, use_reloader=True) 

Se l'effetto pila cane è ancora un problema per voi, vorrei suggerire di migrare da Beaker a qualcos'altro. Per esempio. dogpile.cache

Problemi correlati