2012-08-06 25 views
7

Tôi đang chuyển cấu hình phiên của ứng dụng Kim tự tháp từ cookie sang ext:memcached. Ứng dụng của tôi được lưu trữ trên Heroku và tôi đã định cấu hình memcache addon theo their documentation của mình.Tôi có nên cấu hình `session.lock_dir` của Beaker khi sử dụng Memcache trên Heroku không?

Tôi hiểu từ số Beaker documentation rằng việc chỉ định session.lock_dir là điều cần thiết để ngăn chặn dog pile effect. Để rõ ràng: Tôi phải cung cấp đường dẫn tệp đến thư mục. Beaker sau đó sử dụng điều này như một loại khóa để ngăn chặn nhiều khách hàng tất cả cố gắng để đặt cùng một giá trị cùng một lúc.

Với tôi, điều này nghe có vẻ như kiến ​​trúc xấu. Một trong những ưu điểm chính của memcache là nó hoạt động như một dịch vụ chia sẻ bên ngoài. Ràng buộc các quy trình ứng dụng của tôi vào một khóa ràng buộc đĩa có vẻ giống như cách tiếp cận sai.

Tương tự, trên Heroku, tôi có một hệ thống tệp ephemeral cho mỗi "dyno" (mà tôi hiểu là có ý nghĩa cho mỗi quy trình). Vì vậy, trong khi tôi có thể cung cấp một đường dẫn thư mục lock_dir, nếu mỗi quá trình sử dụng một thư mục khác nhau, sau đó điều này sẽ bảo vệ tôi khỏi hiệu ứng đống chó?

Tôi không chắc liệu tôi có nên:

  • định một lock_dir và không lo lắng về nó
  • nỗ lực đến ngã ba Beaker và vá này bằng cách nào đó

Ngoài ra tôi rất muốn biết các ngôn ngữ/khuôn khổ khác sử dụng ở đây. Đây có phải chỉ là vấn đề về Beaker hay các thiết lập khác không bị ràng buộc tập tin bị ảnh hưởng của đống chó?

Xin cảm ơn trước,

James.

+0

Tôi khá chắc chắn rằng chương trình phụ trợ của memcached không yêu cầu 'lock_dir', bạn đã thử nó chưa? –

+0

Xin chào Michael, 'beaker.ext.memcached' yêu cầu lock_dir, khi sử dụng bất kỳ phần phụ trợ nào ngoài' bộ nhớ' hoặc 'cookie'. [Truy nguyên của tôi tại đây] (https://raw.github.com/gist/3278155/d744c1087445b5c18270212796026dbafe9b5760/gistfile1.pytb). – thruflo

+1

Xin lỗi, bình luận cuối cùng của tôi đã không thực sự có ý nghĩa. Phần phụ trợ memcached yêu cầu 'lock_dir'. Traceback tôi đăng được kích hoạt bởi [mã này] (https: // bitbucket.org/bbangert/cốc/src/d1757ad53763/cốc/ext/memcached.py # cl-85). Tôi đã đi qua [thảo luận này về cùng một vấn đề] (https://bitbucket.org/bbangert/beaker/issue/78/clusterable-session). Hình như câu trả lời là: "chỉ định một lock_dir và không phải lo lắng về nó". – thruflo

Trả lời

0

Thật không may, theo kinh nghiệm của tôi, Cốc không hoạt động tốt trên cơ sở hạ tầng đa cấp do thiếu khóa phân phối. Nếu bạn sử dụng cốc thủy tinh trong ứng dụng web chạy trên 2 máy, hiệu ứng đống chó vẫn xảy ra (tuy nhiên nó có thể tránh được bằng cách dán tất cả các yêu cầu từ cùng một người dùng vào một máy chủ, nhưng nó không hoạt động trên tất cả các nền tảng).

Đôi khi bạn chỉ có thể bỏ qua hiệu ứng chồng chó, đôi khi không. Ví dụ. nếu bạn lưu trữ dữ liệu toàn cục, hiệu ứng đống chó là đau. Nếu bạn lưu trữ dữ liệu người dùng, đôi khi bạn có thể bỏ qua nó.

Trong trường hợp của bạn, tôi sẽ bỏ qua nó. Cốc cho phép bạn sử dụng phần mở rộng Memcache mà không cần bất kỳ thư mục khóa nào. Trong trường hợp này, khóa cốc hoạt động trên mỗi quá trình chỉ sử dụng khóa ren.

Đây là bằng chứng:

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) 

Nếu hiệu ứng đống chó vẫn là một vấn đề cho bạn, tôi sẽ đề nghị để di chuyển từ Beaker đến cái gì khác. Ví dụ. dogpile.cache

Các vấn đề liên quan