不幸的是,根据我的经验,由于没有分布式锁,Beaker 在多主机基础架构上不能很好地工作。如果您在 2 个主机上运行的 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)
如果狗桩效应对您来说仍然是一个问题,我建议从 Beaker 迁移到其他东西。例如dogpile.cache