2011-11-16 20 views
15

Có vẻ như cách duy nhất để làm cho API kênh GAE khả thi về tài chính là triển khai một số loại cơ chế tổng hợp (một trong những người quản lý sản phẩm ứng dụng cao cấp thậm chí đã nói với tôi điều này khi tôi gửi qua email cho họ) về giá cắt cổ) để sử dụng lại các kênh chưa hết hạn.Phương pháp tốt nhất của Channel Pooling trong Google App Engine

Tôi đã suy nghĩ về các cách (địa điểm) để triển khai kênh kênh, nhưng mỗi phương pháp tôi nghĩ có một số hạn chế khá nghiêm trọng.

Bộ nhớ tĩnh của Servlet - Tốt, nhưng sẽ giảm khá nhiều kênh mở khi một phiên bản VM mới mở và/hoặc máy khách được truyền từ máy ảo này sang máy ảo khác.

Memcache - Ít nhất bộ nhớ có thể truy cập toàn cầu từ tất cả các máy ảo, nhưng hiện tại khả năng giảm một kênh rất khả thi có thể lớn hơn do không hoạt động và áp lực bộ nhớ.

Biện pháp phụ trợ - Có lẽ là lựa chọn tốt nhất về độ tin cậy, nhưng bây giờ chi phí chạy chương trình phụ trợ sẽ tiết kiệm tất cả các khoản tiết kiệm thực hiện hồ bơi ngay từ đầu!

Có một địa điểm/cách nào tốt hơn để triển khai kênh kênh trên các máy ảo mà tôi đang thiếu hoặc tôi không cần thiết treo lên những hạn chế của các tùy chọn của mình ở đây? Tôi thực sự hy vọng có, hoặc có vẻ như ứng dụng của tôi sẽ phải hoàn nguyên để bỏ phiếu (có vẻ hơi rẻ hơn trong các số liệu sơ bộ của tôi).

+0

Bạn có thể lưu chúng trong kho dữ liệu với dấu thời gian, sau đó chạy cron để xóa dấu thời gian không? Mặc dù các ops đọc/ghi cũng sẽ tốn kém cho bạn ... –

+0

@ Jonathan Newmuis Vâng, kinda đi cùng với giải pháp Memcache, nhưng giống như bạn đã đề cập, nó chắc chắn không phải là không có chi phí. Có lẽ với hai người trong số họ làm việc kết hợp đó sẽ là lựa chọn khả thi nhất ... Bất kỳ ai có bất kỳ số liệu hoặc kinh nghiệm cố gắng này? – depthfirstdesigner

+0

bạn có thể thêm một số thông tin về phần mềm của bạn không? – AlfredoVR

Trả lời

8

Đây là những gì tôi muốn làm (. Tôi thực sự xem xét văn bản thư viện này sau khi nhìn thấy câu hỏi của bạn tôi cần nó quá):

Tạo một module taskpool với các API sau.

client_id, token = taskpool.get() 

# Setup a heartbeat in the client JS, maybe every minute. 
# Also call this every time the client indicates presence 
taskpool.ping(client_id) 

taskpool.release(client_id) 

Thực hiện:

  • Store client_idtoken trong một thực thể, với một trạng thái cho biết cho dù đó đang được sử dụng, thời gian ping ngoái, và thời gian sáng tạo. Hãy để client_id là chìa khóa. Cũng xem xét sử dụng NDB. Memcaching miễn phí.

get() kiểm tra xem có mã thông báo không sử dụng và trả lại mã nếu có. Nếu không tạo một cái mới, lưu trữ và trả lại nó.

ping() cập nhật thời gian ping cuối cùng cho mã thông báo đó. Thay vì bỏ phiếu, hãy để khách hàng gửi ping mỗi lần [nhịp tim].

release() đánh dấu mã thông báo là không sử dụng.

Chạy một tác vụ/cron cứ mỗi giây [nhịp tim] để tìm các mã thông báo không nhận được ping trong một thời gian - và đặt chúng làm không sử dụng.

Khi khách hàng báo cáo mã thông báo đã đóng, hãy thực hiện get().

Hãy nhớ rằng, mất mát về bảo mật là sản phẩm phụ của bất kỳ loại tổng hợp mã thông báo nào. Nếu một khách hàng độc hại đã giữ một mã thông báo và ngừng gửi nhịp tim, sau này nó có thể lắng nghe các tin nhắn được truyền cho khách hàng mới khi mã thông báo được tái định nghĩa.Đây không phải là một vấn đề nếu bạn đang ở trên một trang web công cộng hoàn toàn, nhưng hãy nhớ nó.

Tôi sẽ cập nhật câu trả lời này nếu và khi tôi viết thư này làm thư viện.

+0

Cảm ơn câu trả lời sáng tạo Sudhir, nhưng NDB là gì? Theo tôi biết API App Engine Memcache hiện tại đã miễn phí chưa? Điều này chắc chắn giống như một giải pháp khả thi, đầy đủ tính năng, nhưng tôi rất tò mò muốn xem những phần này chuyển động như thế nào (crons/tasks và datastore) thực hiện hành động. Vui lòng cho chúng tôi biết nếu bạn khởi động thư viện (đặc biệt nếu bạn mở kho lưu trữ nguồn mở :)). – depthfirstdesigner

+0

NDB là API kho dữ liệu mới trong phiên bản 1.6.0 trở đi: http: //code.google.com/p/appengine-ndb-experiment/. Đã cập nhật câu trả lời bằng một liên kết. –

+0

Ồ, và bởi 'memcaching miễn phí' tôi có nghĩa là NDB sẽ chăm sóc bộ nhớ đệm cho bạn. Không có dòng mã bổ sung nào. –

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