【问题标题】:Should I configure Beaker's `session.lock_dir` when using Memcache on Heroku?在 Heroku 上使用 Memcache 时,我应该配置 Beaker 的 `session.lock_dir` 吗?
【发布时间】:2012-08-03 17:12:37
【问题描述】:

我正在将 Pyramid 应用程序的会话配置从 cookie 切换到 ext:memcached。我的应用程序托管在 Heroku 上,我已经按照 their documentation 配置了他们的 memcache addon

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

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

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

我不确定是否应该:

  • 指定一个lock_dir,不用担心
  • 尝试 fork Beaker 并以某种方式修补此问题

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

提前致谢,

詹姆斯。

【问题讨论】:

标签: python heroku memcached pyramid beaker


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 2015-12-17
    • 2011-10-29
    • 1970-01-01
    相关资源
    最近更新 更多