2012-08-06 6 views
7

私はピラミッドアプリケーションのセッション構成をcookieからext:memcachedに切り替える予定です。私のアプリケーションはHerokuでホストされており、としてmemcache addonを設定しています。HerokuでMemcacheを使用するとき、Beakerの `session.lock_dir`を設定する必要がありますか?

私はBeaker documentationからsession.lock_dirを指定することは、dog pile effectを防ぐために不可欠であることを理解しています。明示するには:私はディレクトリにファイルパスを提供する必要があります。 Beakerは、これを何らかの種類のロックとして使用して、複数のクライアントがすべて同時に同じ値を設定しようとするのを防ぎます。

私にとって、これは悪いアーキテクチャのように思えます。 memcacheの主な利点の1つは、共有外部サービスとして機能することです。私のアプリケーションプロセスをディスクバインドロックにバインドするのは間違ったアプローチのようです。

同様に、Herokuでは、 "dyno"あたり1つのephemeralファイルシステムを持っています(これはプロセスごとに意味が分かります)。だから私はlock_dirディレクトリのパスを提供することができますが、各プロセスが別のディレクトリを使用する場合、これは犬の杭の効果から私を守るでしょうか?

  • がlock_dirを指定し、ビーカーをフォークすることが
  • しようと心配していないと、この何とか

にパッチを適用プラス私がしてみたい:私はする必要があるかどうか

は私はわかりません他の言語/フレームワークがここでどのようなパターンを使用しているかを知る。これはちょうどビーカーの問題ですか、それとも他のファイルバインドされていない設定が犬のパイル効果に苦しんでいますか?

ありがとうございました。

James

+0

memcachedのバックエンドは 'lock_dir'を必要としないと確信しています。 –

+0

こんにちはMichael、 'beaker.ext.memcached'は、' memory'や 'cookie'以外のバックエンドを使うときはlock_dirが必要です。 [私のトレースバック](https://raw.github.com/gist/3278155/d744c1087445b5c18270212796026dbafe9b5760/gistfile1.pytb)。 – thruflo

+1

申し訳ありませんが、私の最後のコメントは実際には意味がありませんでした。 memcachedバックエンドには 'lock_dir'が必要です。私が投稿したトレースバックは[this code](https:// bitbucket。org/bbangert/beaker/src/d1757ad53763/beaker/ext/memcached.py#cl-85)。私は[同じ問題のこのディスカッション](https://bitbucket.org/bbangert/beaker/issue/78/clusterable-session)に出くわしました。答えは "lock_dirを指定し、それについて心配しないでください"のように見えます。 – thruflo

答えて

0

私の経験によれば、分散ロックがないため、Beakerはマルチホストインフラストラクチャではうまく動作しません。 2つのホスト上で実行されているWebアプリケーションでビーカーを使用すると、dog pile効果が発生します(ただし、同じユーザーのすべての要求を1つのサーバーに貼り付けることで回避できますが、すべてのプラットフォームで機能しません)。

時には犬の杭の効果を無視することができますが、時々そうではありません。例えば。グローバルデータをキャッシュすると、犬のパイル効果は痛みです。ユーザーデータをキャッシュすると、時々無視することができます。

あなたの場合、私はそれを無視します。ビーカーを使用すると、ロックディレクトリなしで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

関連する問題