2012-08-06 37 views
7

我将金字塔应用程序的会话配置从cookie切换为ext:memcached。我的应用程序托管在Heroku上,我根据their documentation配置了他们的memcache addon在Heroku上使用Memcache时,我应该配置烧杯的`session.lock_dir`吗?

我从Beaker documentation了解到,指定session.lock_dir对于防止dog pile effect是必不可少的。要明确:我必须提供一个文件路径到一个目录。烧杯然后使用它作为某种锁定,以防止多个客户端同时尝试设置相同的值。

对我来说,这听起来像是坏的建筑。 memcache的主要优点之一是它可以用作共享的外部服务。将我的应用程序进程绑定到磁盘绑定锁似乎是错误的方法。

同样,在Heroku上,我有一个ephemeral文件系统,每个“dyno”(我的理解是指每个进程)。所以,虽然我可以提供一个lock_dir目录路径,如果每个进程使用不同的目录,那么这会保护我免受狗桩效应吗?

我不知道我是否应该:

  • 指定lock_dir而不用担心它
  • 企图叉烧杯和修补这个莫名其妙

另外,我很乐意了解其他语言/框架在此使用的模式。这只是一个烧杯问题,或者其他非文件绑定设置遭受狗桩效应?

在此先感谢,

詹姆斯。

+0

我很肯定memcached的后端不需要'lock_dir',你有没有试过它? – 2012-08-06 19:49:33

+0

嗨迈克尔,'beaker.ext.memcached'需要一个lock_dir,当使用除了'memory'或'cookie'之外的任何后端时。 [我的踪影在这里](https://raw.github.com/gist/3278155/d744c1087445b5c18270212796026dbafe9b5760/gistfile1.pytb)。 – thruflo 2012-08-06 20:30:45

+1

对不起,我最后的评论并没有实际意义。 memcached后端确实需要'lock_dir'。我发布的回溯由[this code](https:// bitbucket。)触发。组织/ bbangert /烧杯/ SRC/d1757ad53763 /烧杯/ EXT/memcached.py#CL-85)。我遇到过[对同一问题的这种讨论](https://bitbucket.org/bbangert/beaker/issue/78/clusterable-session)。看起来答案是:“指定一个lock_dir而不用担心它”。 – thruflo 2012-08-06 20:53:44

回答

0

不幸的是,根据我的经验,由于没有分布式锁,Beaker在多主机基础架构上不能很好地工作。如果您在两台主机上运行的Web应用程序中使用烧杯,则狗堆效应仍会发生(但可以通过将来自同一用户的所有请求粘贴到一台服务器来避免,但它不适用于所有平台)。

有时你可以忽略狗桩效应,有时候不会。例如。如果你缓存全局数据,狗桩效应是痛苦的。如果您缓存用户数据,有时可以忽略它。

就你而言,我会忽略它。烧杯允许您在没有任何锁定目录的情况下使用Memcache扩展。在这种情况下,Beaker锁定每个进程的工作只能使用线程锁定。

这里是证明:

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) 

如果狗桩效果仍然是你的问题,我建议从烧杯转移到别的东西。例如。 dogpile.cache