2009-05-04 33 views
9

Tôi đang xây dựng một máy chủ mạng và bắt đầu nhiều AppDomain trên máy chủ mà các yêu cầu được định tuyến. Điều gì sẽ là cách nhanh nhất để gửi một tải trọng yêu cầu đến một trong các AppDomains để xử lý?Gửi các mảng byte lớn giữa các miền AppDomain trong cùng một quá trình

  1. Đọc trong tải trọng từ ổ cắm vào một mảng byte và sắp xếp nó.
  2. So sánh luồng mạng (kế thừa từ MarshalByRef) với AppDomain.
  3. Đọc tải trọng. Giải mã nó thành các đối tượng. So sánh các đối tượng được giải mã.
  4. Sử dụng các đường ống được đặt tên để truyền mảng byte.
  5. Sử dụng ổ cắm loopback.
  6. Có thể có một cách để sắp xếp kết nối ổ cắm thực tế?

Các giải mã hầu hết là tạo ra đối tượng bất biến được sử dụng để xác định làm thế nào để đáp ứng các khách hàng yêu cầu và AppDomain sau đó tạo ra một phản ứng và nguyên soái nó trở lại AppDomain máy chủ mà gửi nó trở lại thông qua socket.

Phương pháp này sẽ thích ít bộ nhớ hơn CPU ít hơn.

WCF không phải là một tùy chọn.

Trả lời

1

TCP nhị phân từ xa chắc chắn là nhanh, tôi không nhanh hơn bao nhiêu so với ổ cắm nguyên liệu mà có lẽ là nhanh nhất, nhưng một PIA hoàng gia.

Tôi đã chạy 1500 - 2000 req mỗi giây trong quá trình sản xuất bằng cách sử dụng tính năng chuyển tiếp nhị phân HTTP giữa hai hộp. Trên cùng một hộp, bạn nên có hiệu suất cao bằng cách sử dụng TCP hoặc một kênh ống tên, tùy thuộc vào chu kỳ CPU cần để xử lý dữ liệu.

1

Nếu tôi là bạn, tôi sẽ xem xét cách Cassini được triển khai. Nó thực hiện khá chính xác những gì bạn đang nói về làm.

Thực ra Cassini đã được loại superceded bởi Webhost là máy chủ web được tích hợp sẵn với Visual Studio ngay bây giờ. Hãy xem this post trên blog của Phil Haack để biết thêm.

+0

Cassini lắng nghe các kết nối trong AppDomain từ xa. Có vẻ như OP muốn nghe trên socket trên AppDomain mặc định. –

1

Câu hỏi rất hay. Nếu tôi gặp vấn đề này, tôi có thể sử dụng Buffered Stream/Memory Stream và sắp xếp luồng vào AppDomain để tiêu thụ đối tượng để giảm marshaling hoặc tuần tự hóa nhiều đồ thị đối tượng được tạo trong một AppDomain khác. Tuy nhiên, sau đó một lần nữa, có vẻ như bạn gần như hoàn toàn sao chép các chức năng của IIS, vì vậy tôi sẽ xem/phản xạ vào không gian tên System.Web.Hosting và xem cách họ xử lý nó và WorkerThreadPool của họ, v.v ...

1

6. Có thể có cách để sắp xếp kết nối ổ cắm thực tế ?

Thứ sáu là IMO là tùy chọn tốt nhất. Ổ cắm từ phối cảnh quá trình chỉ là một tay cầm. AppDomains nằm trong một quá trình. Điều đó có nghĩa là appdomains có thể trao đổi các chốt socket.

Nếu marshalling socket không hoạt động, bạn có thể thử tạo lại socket trong appdomain khác. Bạn có thể sử dụng DuplicateAndClose để thực hiện việc này.

Nếu điều đó không hiệu quả, bạn nên thực hiện một số thử nghiệm hiệu suất để chọn phương pháp truyền dữ liệu tốt nhất. (Tôi sẽ chọn các đường ống được đặt tên hoặc các tệp được ánh xạ từ memomry)

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