在Heroku上使用Memcache时,我应该配置烧杯的`session.lock_dir`吗?
我将金字塔应用程序的会话配置从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而不用担心它
- 企图叉烧杯和修补这个莫名其妙
另外,我很乐意了解其他语言/框架在此使用的模式。这只是一个烧杯问题,或者其他非文件绑定设置遭受狗桩效应?
在此先感谢,
詹姆斯。
不幸的是,根据我的经验,由于没有分布式锁,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
我很肯定memcached的后端不需要'lock_dir',你有没有试过它? – 2012-08-06 19:49:33
嗨迈克尔,'beaker.ext.memcached'需要一个lock_dir,当使用除了'memory'或'cookie'之外的任何后端时。 [我的踪影在这里](https://raw.github.com/gist/3278155/d744c1087445b5c18270212796026dbafe9b5760/gistfile1.pytb)。 – thruflo 2012-08-06 20:30:45
对不起,我最后的评论并没有实际意义。 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