2011-11-19 33 views
5

Tôi cần tạo dịch vụ WCF chấp nhận yêu cầu của khách hàng và kết nối nội bộ với máy từ xa để thực hiện công việc. Máy từ xa có khả năng xử lý rất tốt nhưng không có tốc độ xử lý tốt. Điều này có nghĩa là có thể xử lý ví dụ 1000 giao dịch mỗi giây nhưng mỗi giao dịch có thể mất 1 giây, vì vậy cách duy nhất là có 1.000 giao dịch đồng thời chạy trong cùng một giây.Xử lý bên máy chủ không đồng bộ WCF

Máy từ xa xử lý rất tốt tình huống này, nhưng tôi lo lắng về WCF, nếu mỗi giao dịch là nội bộ (tôi không quan tâm mô hình phía máy khách (đồng bộ hoặc không đồng bộ)) chờ và chặn luồng bên trong máy chủ cho 1 hoặc 2 giây này có thể đại diện cho một 1000 chủ đề làm việc trực tiếp và điều đó có thể rất nguy hiểm, hoặc có thể WCF sử dụng các hồ bơi thread và chỉ cần đặt những người khác yêu cầu trong trạng thái chờ đợi và đó là xấu quá.

Vì vậy, câu hỏi của tôi là về khả năng xử lý yêu cầu không đồng bộ ở phía máy chủ. Vì vậy, dòng chảy giao dịch phải là như thế này:

  1. cliente khởi tạo một yêu cầu (ở bên mình là một yêu cầu đồng bộ)
  2. server recive yêu cầu và đặt yêu cầu này trong một Queue giao dịch và phát hành các chủ đề
  3. Khi tác vụ kết thúc, máy chủ hoàn tất yêu cầu gửi HTTP 200 và dẫn đến máy khách.

Cảm ơn!

+0

Nếu bạn đang phục vụ dịch vụ wcf của mình trong IIS, bạn sẽ không cần thực hiện bất kỳ điều nào ở trên. IIS sẽ tạo một chuỗi riêng biệt cho mỗi yêu cầu, khởi tạo một thể hiện mới của wcf của bạn, xử lý yêu cầu và trả về kết quả. Nếu tồn tại một luồng có sẵn, IIS sẽ sử dụng nó thay vì spooling một cái mới. – edepperson

+0

Điều đó không giải quyết được vấn đề của tôi về Chủ đề "bão hòa", tôi cần một xử lý async không phải là sử dụng lại thread –

Trả lời

1

Bạn có thể sử dụng mẫu không đồng bộ WCF để đạt được điều này. Khi bạn đánh dấu hoạt động của bạnKết hợp với thuộc tính async, WCF sử dụng các chuỗi IO CompletionPort để xử lý yêu cầu.

để nó hoạt động theo cách sau. Yêu cầu của bạn được xử lý bởi một thread trong IIS và một khi nó đạt WCF nó đi vào giấc ngủ và sau đó IO CompletionPort thread có quá trình yêu cầu nó và sau đó gửi trả lời cho thread IIS trả về phản hồi cho máy khách.

Hoàn thành IOCác chuỗi nhanh hơn và cũng không làm chậm máy chủ của bạn về hiệu suất hoặc tài nguyên.

Nhìn vào link sau để biết thêm thông tin.

+0

Nhưng làm thế nào để làm điều đó. Với một tham số đơn giản là không thể giải phóng một luồng đang chờ phản hồi từ một cơ sở dữ liệu o từ một máy bên ngoài. Async phải được nhà phát triển triển khai, chỉ nhà phát triển mới biết cách giao dịch tiếp tục sau khi sự kiện hoàn thành không đồng bộ.Bạn trả lời AIM để tránh chặn luồng giữa IIS và WCF nhưng không phải giữa WCF và cơ sở dữ liệu (ví dụ) –

+0

Bạn có nghĩa là bạn không muốn một luồng bị chặn cho đến khi quá trình hoàn tất. Trong một kịch bản như vậy, bạn có thể lấy IsOneWayOperation, nơi máy khách chỉ cần thực hiện một yêu cầu và quên. Nếu bạn muốn máy khách lấy lại phản hồi, hãy thử triển khai kịch bản song công đầy đủ nơi máy khách chỉ định một cuộc gọi lại đến máy chủ và khi xử lý xong, máy chủ thực hiện một cuộc gọi lại để cập nhật trạng thái. – Rajesh

+1

Tôi thấy rằng có thể lớp công việc không đồng bộ/đang chờ đợi có thể là giải pháp, tôi sẽ điều tra điều này. –

0

Trong máy chủ tầng giữa, kê khai và thực hiện các hoạt động của mình theo mô hình async:

[OperationContract(Action = "DoSomething", AsyncPattern = true)] 
IAsyncResult BeginDoSomething(AsyncCallback asyncCallback, object asyncState); 
void EndDoSomething(IAsyncResult iar); 

Việc thực hiện BeginDoSomething nên gửi yêu cầu đến máy tính từ xa và gửi lại ngay lập tức. Khi bạn gọi DoSomething() ở phía máy khách, WCF ở tầng giữa sẽ nhận ra rằng thao tác này được thực hiện như một cặp Begin/End không đồng bộ và gọi nó một cách thích hợp.

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