Tôi thực sự ở giữa đưa ra quyết định tương tự. Trong trường hợp của tôi, tôi có một dịch vụ WCF đang chạy trong một vai trò web mà nên tắt tải tính toán cho vai trò của nhân viên. Khi kết quả đã được tính toán, vai trò web sẽ trả về câu trả lời cho khách hàng.
Kiến thức cơ bản về cấu trúc dữ liệu của tôi cho tôi biết rằng tôi nên tránh sử dụng thứ gì đó được thiết kế dưới dạng hàng đợi theo cách không xếp hàng. Điều đó có nghĩa là một hàng đợi nên luôn luôn được phục vụ theo cách thức giống như FIFO. Vì vậy, về cơ bản nếu sử dụng hàng đợi cho cả hai yêu cầu và phản hồi, các luồng đang đợi trả về dữ liệu cho máy khách sẽ phải chờ cho đến khi thông báo tính toán nằm ở "hàng đầu" của hàng đợi phản hồi, không tối ưu.Nếu lưu trữ các câu trả lời bằng cách sử dụng các bảng Azure, các cuộc thăm dò chủ đề cho các thông điệp tạo chi phí không cần thiết
Điều tôi tin là một giải pháp khả thi cho vấn đề này là sử dụng hàng đợi cho các yêu cầu. Điều này cho phép sử dụng mẫu người tiêu dùng cạnh tranh và do đó cân bằng tải. Trên thư được gửi vào hàng đợi này, bạn đặt correlationId property trên thư. Để trả lời phần pub/sub ("chủ đề") của xe buýt dịch vụ Azure được sử dụng togehter với một correlation filter. Khi back-end của bạn đã xử lý yêu cầu, nó đã xuất bản kết quả cho một "responseSubject" với correlationId được đưa ra trong yêu cầu ban đầu. Bây giờ phản ứng này ca được lấy bởi khách hàng của bạn bằng cách gọi CreateSubscribtion (Xin lỗi, tôi không thể đăng nhiều hơn hai liên kết rõ ràng, google nó) bằng cách sử dụng bộ lọc tương quan đó, và nó sẽ được thông báo khi câu trả lời được xuất bản. Lưu ý rằng phần CreateSubscribtion chỉ nên được thực hiện một lần trong phương thức OnStart. Sau đó, bạn có thể làm một async BeginRecieve trên đăng ký đó và vai trò sẽ được thông báo trong cuộc gọi lại đã cho khi một phản hồi cho một trong các yêu cầu của nó có sẵn. CorrelationId sẽ cho bạn biết yêu cầu phản hồi là gì. Vì vậy, thử thách cuối cùng của bạn là đưa ra phản hồi này về chủ đề giữ kết nối máy khách.
Điều này có thể đạt được bằng cách tạo Từ điển với correlationId's (có thể là GUID) làm khóa và phản hồi dưới dạng giá trị. Khi vai trò web của bạn nhận được yêu cầu, nó tạo ra guid, đặt nó là correlationId, thêm nó vào hashset, gửi tin nhắn đến hàng đợi và sau đó gọi Monitor.Wait() trên đối tượng Guid. Sau đó, có phương thức nhận được gọi bằng cách đăng ký chủ đề thêm phản hồi vào từ điển và sau đó gọi Monitor.Notify() trên cùng một đối tượng guid đó. Điều này đánh thức yêu cầu ban đầu của bạn và bây giờ bạn có thể trả lời câu trả lời cho khách hàng của bạn (Hoặc một cái gì đó. Về cơ bản bạn chỉ muốn thread của bạn ngủ và không tiêu thụ bất kỳ tài nguyên nào trong khi chờ đợi)
Đây là những gì tôi đã suy nghĩ. Chúng tôi đã bao gồm một chiến lược GUID Id tương quan, nhưng nó có vẻ như rất nhiều phiếu thăm dò ý kiến trên hàng đợi phản hồi đó, trong đó vai trò Web kéo các câu trả lời không liên quan. Khi tôi gọi GetMessage() là có một cách để nhanh chóng phát hành nó trong các sự kiện có khả năng rằng nó không phải là phản ứng tôi đã chờ đợi? Hoặc, cách khác, có lẽ tôi có thể cung cấp cho mỗi cá thể Web Role một hàng đợi chuyên dụng. Thậm chí sau đó, những hàng đợi này không phải là FIFO, vì vậy tôi vẫn cần kiểm tra id tương quan đó. Suy nghĩ? –
Bắt với điều này là nếu bạn có nhiều hơn một ví dụ của webrole (hoặc thậm chí yêu cầu khác chạy trên cùng một vai trò web), có một cơ hội rằng thông điệp dành cho ví dụ 1 sẽ nhận được bằng ví dụ 2, mà sẽ kiểm tra các tương quan id, nhận ra nó không phải chờ đợi cho nó và phải đặt nó trở lại trên hàng đợi. Tôi đã thử điều này và nó không quy mô rất tốt. Ý tưởng bàn là tốt hơn nhiều. – knightpfhor
Cảm ơn bạn đã thêm nhận xét này. Tôi đã lo lắng về điều đó, xem xét rằng IIS có thể xử lý nhiều yêu cầu cùng một lúc trên cùng một hộp. –