在Heroku上使用Memcache时,我应该配置Beaker的`session.lock_dir`吗?

thr*_*flo 7 python memcached heroku beaker pyramid

我从切换金字塔应用的会话配置cookieext:memcached.我的应用程序托管在Heroku上,我根据他们的文档配置了他们的memcache插件.

我从Beaker的文档中了解到,指定a session.lock_dir对于防止狗堆效应至关重要.要明确:我必须提供目录的文件路径.Beaker然后将其用作某种锁,以防止多个客户端同时尝试设置相同的值.

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

同样,在Heroku上,每个"dyno" 我有一个短暂的文件系统(我理解这意味着每个进程).因此,虽然我可以提供lock_dir目录路径,但如果每个进程使用不同的目录,那么这会保护我免受狗堆效应吗?

我不确定我是否应该:

  • 指定一个lock_dir而不用担心它
  • 试图分叉Beaker并以某种方式修补它

另外,我想知道其他语言/框架在这里使用的模式.这只是一个烧杯问题还是其他非文件绑定设置遭受狗堆效应?

提前致谢,

詹姆士.

Dmi*_*ylo 0

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

有时你可以忽略狗堆效应,有时则不能。例如,如果您缓存全局数据,狗堆效应会很痛苦。如果缓存用户数据,有时可以忽略它。

对于你的情况,我会忽略它。Beakers 允许您使用 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)
Run Code Online (Sandbox Code Playgroud)

如果狗堆效应对您来说仍然是个问题,我建议从烧杯迁移到其他东西。例如dogpile.cache