2010-05-23 47 views
6

Tôi có nhiều triển khai Singleton trong ứng dụng asp.net và muốn di chuyển ứng dụng của mình sang môi trường IIS Web Garden vì một số lý do hiệu suất.Đối tượng Singleton trong IIS Web Garden

CMIIW, chuyển sang IIS Web Garden với quá trình n công nhân, sẽ có một đối tượng singleton tạo trong mỗi quá trình lao động, mà làm cho nó không phải là một đối tượng duy nhất nữa vì n> 1.

thể Tôi làm tất cả những đối tượng đơn lẻ đó, singleton một lần nữa trong IIS Web Garden?

Trả lời

10

Tôi không tin rằng bạn có thể (trừ khi bạn có thể nhận được những công nhân IIS để sử dụng các đối tượng trong bộ nhớ chia sẻ bằng cách nào đó).

Đây là vấn đề về phạm vi. Ví dụ đơn lẻ của bạn sử dụng không gian xử lý làm phạm vi của nó. Và như bạn đã nói, việc triển khai của bạn hiện đã trải qua nhiều quy trình. By definition, trên hầu hết các hệ điều hành, các trình đơn sẽ được gắn với một không gian xử lý nhất định vì nó được gắn với một cá thể lớp đơn lẻ hoặc đối tượng.

Bạn có thực sự cần một đĩa đơn? Đó là một câu hỏi rất quan trọng để hỏi trước khi sử dụng mẫu đó. Như Wikipedia nói, một số xem xét nó là một mẫu chống (hoặc mã mùi, vv).

Ví dụ về thiết kế thay thế mà có thể làm việc bao gồm ...

  1. Bạn có thể có nhiều đối tượng đồng bộ hóa với một cửa hàng Trung ương hoặc với nhau.
  2. Sử dụng tuần tự hóa đối tượng nếu có.
  3. Sử dụng Dịch vụ Windows và một số dạng IPC, ví dụ: System.Runtime.Remoting.Channels.Ipc

Tôi thích tùy chọn 3 cho các trang web lớn. Dịch vụ Windows đồng hành rất hữu ích cho các trang web lớn. Rất nhiều thứ như gửi thư, công việc hàng loạt, v.v. nên đã được tách riêng khỏi quy trình nhân viên xử lý giao diện người dùng. Bạn có thể đẩy đối tượng máy chủ singleton vào quá trình đó và sử dụng các đối tượng máy khách trong các quy trình công nhân IIS của bạn.

Nếu lớp singleton của bạn hoạt động với nhiều đối tượng chia sẻ trạng thái hoặc chỉ chia sẻ trạng thái ban đầu, thì tùy chọn 1 và 2 sẽ hoạt động tương ứng.

Sửa

Từ ý kiến ​​của bạn có vẻ như tùy chọn đầu tiên trong hình thức của một Distributed cache nên làm việc cho bạn.

Có rất nhiều triển khai bộ nhớ cache được phân phối trên mạng.

  1. Microsoft AppFabric (trước đây gọi là Velocity) là bước tiến gần đây nhất của họ vào không gian này.
  2. Memcached ASP.Net Provider
  3. NCache (MSDN Article) - Tuỳ chỉnh ASP.Net nhà cung cấp bộ nhớ cache của hỗ trợ OutProc.Nên có các nhà cung cấp Cache tùy chỉnh khác ngoài đó.
  4. Phát bộ nhớ cache được phân phối của riêng bạn bằng Windows Services và IPC (tùy chọn 3)

PS. Vì bạn đang đặc biệt xem xét trò chuyện. Tôi chắc chắn khuyên bạn nên nghiên cứu Comet (Comet implementation for ASP.NET?WebSync, v.v.)

+0

phòng trò chuyện rất phức tạp, lưu lượng truy cập rất lớn nhưng chúng tôi muốn nó càng nhạy càng tốt. chúng tôi không đăng nhập thư vào cơ sở dữ liệu, vì vậy tôi cần đối tượng singleton để giữ thư trong bộ nhớ. –

+0

câu hỏi cho tùy chọn 1: làm thế nào để bạn đồng bộ hóa các đối tượng với nhau trong khi họ đang ở trong các quy trình riêng biệt? –

+0

tùy chọn 3 có vẻ là giải pháp khá hứa hẹn. di chuyển các đối tượng singleton sang IpcServerChannel (có thể là một ứng dụng console) và IpcClientChannel sẽ tạo proxy của đối tượng đó. đó là cách bạn nói? –

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