7

Pyramid アプリケーションのセッション構成を から に切り替えていcookieますext:memcached。私のアプリケーションは Heroku でホストされており、ドキュメントに従ってmemcache アドオンを構成しました。

ビーカーのドキュメントから、犬のパイル効果を防ぐにはa を指定することsession.lock_dirが不可欠であることを理解しています。明確に言うと、ディレクトリへのファイル パスを指定する必要があります。Beaker はこれをある種のロックとして使用して、複数のクライアントがすべて同時に同じ値を設定しようとするのを防ぎます。

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

同様に、Heroku では、「dyno」ごとに 1 つのエフェメラルファイルシステムがあります (これは、プロセスごとを意味すると理解しています)。ディレクトリ パスを提供することはできますが、lock_dir各プロセスが異なるディレクトリを使用している場合、これはドッグ パイル エフェクトから保護されますか?

次のことを行うべきかどうかわかりません。

  • lock_dir を指定し、それについて心配する必要はありません
  • Beaker を fork してこれにパッチを当てようとする

さらに、他の言語/フレームワークがここで使用するパターンを知りたいです。これは単なるビーカーの問題ですか、それとも他のファイルに依存しないセットアップでドッグ パイル効果が発生するのでしょうか?

前もって感謝します、

ジェームズ。

4

1 に答える 1

0

残念ながら、私の経験によると、Beaker は分散ロックがないため、マルチホスト インフラストラクチャではうまく機能しません。2 つのホストで実行されている Web アプリでビーカーを使用すると、ドッグ パイル効果が引き続き発生します (ただし、同じユーザーからのすべての要求を 1 つのサーバーに固定することで回避できますが、すべてのプラットフォームで機能するわけではありません)。

犬のパイル効果を無視できる場合もあれば、無視できない場合もあります。たとえば、グローバル データをキャッシュする場合、ドッグ パイル効果は苦痛です。ユーザーデータをキャッシュすると、無視できる場合があります。

あなたの場合、私はそれを無視します。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)

犬のパイル効果がまだ問題である場合は、ビーカーから別のものに移行することをお勧めします. 例: dogpile.cache

于 2015-01-20T08:17:23.480 に答える