7

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

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

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

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

我不确定我是否应该:

  • 指定一个 lock_dir 并且不用担心它
  • 尝试分叉烧杯并以某种方式修补它

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

提前致谢,

詹姆士。

4

1 回答 1

0

不幸的是,根据我的经验,由于没有分布式锁,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

于 2015-01-20T08:17:23.480 回答