2009-07-26 18 views
10

Tôi tò mò về cách thức hoạt động của những người độc thân trong Google App Engine (hoặc bất kỳ môi trường máy chủ phân tán nào). Do ứng dụng của bạn có thể chạy trong nhiều quy trình (trên nhiều máy) cùng một lúc và các yêu cầu có thể được định tuyến tất cả ra khỏi địa điểm, những gì thực sự xảy ra dưới mui xe khi ứng dụng thực hiện điều gì đó như: 'CacheManager.getInstance()'?Làm thế nào để Singletons trong Google App Engine (hoặc thường trong môi trường máy chủ phân tán) hoạt động?

Tôi chỉ sử dụng (GAE) CacheManager làm ví dụ, nhưng quan điểm của tôi là, có một cá thể ứng dụng toàn cầu đơn lẻ của một singleton ở đâu đó, vậy nó ở đâu? RPC có được gọi không? Trên thực tế, trạng thái ứng dụng toàn cầu (như phiên) thực sự được xử lý như thế nào?

Kính trọng, Shane

Trả lời

12

Các trình đơn trong Java của Máy ứng dụng là theo thời gian chạy, không phải trên mỗi webapp. Mục đích của họ đơn giản là cung cấp một điểm truy cập duy nhất cho dịch vụ cơ bản (trong trường hợp của cả Memcache và API người dùng, được truy cập thông qua RPC), nhưng đó hoàn toàn là mẫu thiết kế cho thư viện - không có singleton cho mỗi ứng dụng bất cứ nơi nào mà các phương pháp này truy cập.

+0

Đây là cách tôi dự đoán nó sẽ làm việc, nó là tốt đẹp để có nó xóa lên mặc dù. Chúc mừng. :) – Shane

3

Caches thường được liên kết với một số loại phân phối bộ nhớ cache nhân rộng. Ví dụ: GAE sử dụng phiên bản tùy chỉnh memcached để xử lý việc duy trì bộ nhớ cache chung của các đối tượng trên một cụm, trong khi vẫn duy trì trạng thái lưu trữ ở trạng thái nhất quán. Nói chung có rất nhiều giải pháp cho vấn đề này với rất nhiều sự cân bằng khác nhau được thực hiện về hiệu suất và sự kết hợp bộ nhớ cache (ví dụ, điều quan trọng là tất cả bộ nhớ cache phải phù hợp với 100% thời gian, bộ nhớ đệm phải được ghi vào đĩa để bảo vệ chống mất mát, vv).

Dưới đây là một số sản phẩm mẫu với các tính năng bộ nhớ đệm phân phối (hầu hết có tài liệu mô tả cân bằng các cách tiếp cận khác nhau rất chi tiết:

  • memcached - C với nhiều API client và cổng ngôn ngữ
  • Ehcache - OSS Bộ nhớ cache Java, với việc áp dụng rộng rãi
  • JBoss Cache - Một giải pháp Java OSS phổ biến khác
  • Oracle Coherence (formerly Tangosol Coherence) - Có lẽ là thương mại Java được biết đến nhiều nhất bộ nhớ cache.
  • Indexus Cache - Một giải pháp Net OSS phổ biến
  • NCache - Có khả năng phổ biến nhất Net thương mại giải pháp bộ nhớ đệm

Như bạn có thể thấy, đã có nhiều dự án đã tiếp cận vấn đề này. Một giải pháp có thể là chỉ đơn giản là chia sẻ một bộ nhớ cache trên một máy duy nhất, tuy nhiên, hầu hết các dự án làm cho một số loại nhân rộng và phân phối chuyển đổi dự phòng có thể.

+0

Cảm ơn bạn về các ví dụ về bộ nhớ cache, nhưng tôi đã sử dụng bộ nhớ cache như một ví dụ về việc sử dụng singleton phát triển web. Tôi có thể dễ dàng là Singleton của người dùng. Như tôi đã nói trong câu trả lời ở trên, tôi bị nhầm lẫn bởi ý tưởng về một số đối tượng đơn lẻ tồn tại sau một giai đoạn yêu cầu/phản hồi. Đó là sự hiểu biết của tôi rằng bạn không thể giả định bất cứ điều gì tồn tại một yêu cầu, vì vậy tôi đang cố gắng hiểu những gì singleton thực sự có nghĩa là, và những gì nó làm chính xác trong một môi trường web phân tán. Trong thời gian đó, tôi sẽ nghiên cứu mã cho các ví dụ về bộ nhớ cache mà bạn đã cung cấp, để xem chúng làm gì. – Shane

+0

Tôi đã đưa ra các ví dụ về bộ nhớ đệm, vì không có câu trả lời duy nhất cho câu hỏi này. Nếu bạn muốn singleton được cho mỗi VM (hoặc thậm chí mỗi yêu cầu), bạn sẽ không phân phối nó cả. Mặt khác, nếu bạn muốn chia sẻ singleton trên nhiều máy ảo và yêu cầu, bạn sẽ sử dụng một số loại giải pháp lưu trữ. Điều này cũng đúng đối với việc xử lý phiên. Tôi nghi ngờ rằng "Singletons" mà bạn đang đề cập đến thực sự chỉ cho mỗi VM (thậm chí có thể cho mỗi yêu cầu) singletons được sử dụng để truy cập vào một khách hàng cho các nguồn tài nguyên được chia sẻ. – jsight

0

Tôi không chắc chắn về chi tiết cụ thể của GAE, nhưng thường trong một ứng dụng web kích thước này, bạn sẽ có nhiều quy trình chạy trên một số máy (và sau đó tải cân bằng giữa chúng). Trong mỗi quy trình, nếu bạn đang sử dụng máy chủ web đa luồng, bạn có thể xử lý nhiều yêu cầu. Vì vậy, điều này sẽ cho phép bạn chia sẻ các đối tượng giữa các yêu cầu trong cùng một máy chủ web (và một singleton, ví dụ, bạn sẽ khởi tạo khi quá trình ứng dụng web bắt đầu).

Nếu máy chủ web không phải là đa luồng, nhưng thay vì nhiều quá trình, thì bạn không thể chia sẻ các đối tượng giữa các yêu cầu theo như tôi biết, mà không cần nói chuyện với một quá trình lưu bộ nhớ cache riêng biệt.

Tài liệu GAE dường như hỗ trợ những gì họ gọi là "Ứng dụng lưu vào bộ nhớ cache" về cơ bản cho phép bạn làm điều tương tự, nhưng không rõ ràng đối với tôi từ tài liệu cho dù họ đang làm điều này bằng cách sử dụng web đa luồng máy chủ hoặc một số quy trình lưu vào bộ nhớ cache khác đang chạy cùng với máy chủ web.

Tôi muốn bị lôi cuốn nếu biết CacheManager.getInstance()luôn luôn giải quyết cùng một đối tượng hoặc nếu nó chỉ là cùng một đối tượng cho các yêu cầu được xử lý bởi cùng một máy chủ web. Trong thực tế, nó không quan trọng vì nó chỉ được sử dụng để nói chuyện với quá trình memcached riêng biệt anyway.

+0

Tôi đã nghĩ rằng bản chất của một singleton có nghĩa là nó phải giải quyết cho cùng một cá thể đối tượng. Khi tôi nghĩ rằng yêu cầu, tôi thực sự không bao giờ mong đợi nó có một mối quan hệ quá trình, đặc biệt là với Google App Engine. Tôi hy vọng một yêu cầu đến Úc và tiếp theo là sang Mỹ, vì vậy trên cơ sở đó, phương pháp duy nhất tôi có thể nghĩ tới là một trường hợp đáng tin cậy là một RPC đối với một số loại bộ điều khiển trung tâm. Nó chỉ có vẻ như chống lại quy mô với tôi, do đó quan tâm của tôi. Ví dụ memcache là một trường hợp phức tạp trong môi trường đám mây trải rộng trên nhiều trung tâm dữ liệu. – Shane