2012-08-06 15 views
7

Estoy cambiando la configuración de sesión de una aplicación Pyramid de cookie a ext:memcached. Mi aplicación está alojada en Heroku y he configurado su memcache addon según their documentation.¿Debo configurar el `session.lock_dir` de Beaker cuando uso Memcache en Heroku?

Entiendo por el Beaker documentation que especificar un session.lock_dir es esencial para evitar el dog pile effect. Para ser explícito: debo proporcionar una ruta de archivo a un directorio. A continuación, Beaker lo usa como un tipo de bloqueo para evitar que varios clientes intenten establecer el mismo valor al mismo tiempo.

Para mí, esto suena como una mala arquitectura. Una de las principales ventajas de Memcache es que funciona como un servicio externo compartido. Enlazar mis procesos de aplicación a un bloqueo de disco enlazado parece ser un enfoque equivocado.

Igualmente, en Heroku, tengo un sistema de archivos ephemeral por "dyno" (que entiendo significa cada proceso). Entonces, si bien puedo proporcionar una ruta de directorio lock_dir, si cada proceso usa un directorio diferente, ¿esto me protegería del efecto de pila de perros?

no estoy seguro de si debo:

  • especificar un lock_dir y no preocuparse de que
  • intento de tenedor Cubilete y esto de alguna manera el parche

Además me encantaría saber qué patrón utilizan otros idiomas/marcos aquí. ¿Es solo un problema de Beaker o otras configuraciones no ligadas a archivos sufren el efecto de pila de perros?

Gracias de antemano,

James.

+0

Estoy bastante seguro de que el backend de memcached no requiere un 'lock_dir', ¿lo has probado sin? –

+0

Hola Michael, 'beaker.ext.memcached' requiere un lock_dir, al usar cualquiera de los back-ends aparte de' memory' o 'cookie'. [Mi rastreo aquí] (https://raw.github.com/gist/3278155/d744c1087445b5c18270212796026dbafe9b5760/gistfile1.pytb). – thruflo

+1

Lo siento, mi último comentario en realidad no tenía sentido. El backend de memcached requiere un 'lock_dir'. La traza que publiqué fue activada por [este código] (https: // bitbucket.org/bbangert/beaker/src/d1757ad53763/beaker/ext/memcached.py # cl-85). Me he encontrado [esta discusión sobre el mismo problema] (https://bitbucket.org/bbangert/beaker/issue/78/clusterable-session). Parece que la respuesta es: "especifica un lock_dir y no te preocupes por eso". – thruflo

Respuesta

0

Desafortunadamente, de acuerdo con mi experiencia, Beaker no funciona bien en la infraestructura multihost debido a la ausencia de bloqueo distribuido. Si usas un vaso de precipitados en una aplicación web que se ejecuta en 2 hosts, el efecto de pila de perros aún ocurre (sin embargo, se puede evitar al incluir todas las solicitudes del mismo usuario en un servidor, pero no funciona en todas las plataformas).

A veces puedes simplemente ignorar el efecto de pila de perros, a veces no. P.ej. si almacena en caché datos globales, el efecto de pila de perros es dolor. Si almacena en caché los datos del usuario, puede ignorarlos a veces.

En su caso, lo ignoraría. Beakers te permite usar la extensión Memcache sin ningún directorio de bloqueo. En este caso, Beaker bloquea el trabajo por proceso solo mediante bloqueos de subprocesos.

Aquí está la prueba:

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) 

Si el efecto pila de perro sigue siendo un problema para usted, sugeriría a migrar de Vaso a otra cosa. P.ej. dogpile.cache

Cuestiones relacionadas