2016-05-26 22 views
7

Tôi đang phát triển ứng dụng phân tán với sự giúp đỡ của MassTransitrabbitmqkiến ​​trúc phân tán với MassTransit, RabbitMQ và SignalR

tôi phải cung cấp khả năng tạo báo cáo trên một trang web mà không cần nạp lại trang bằng cách nhấp chuột vào một nút, còn tôi nên gọi một dịch vụ windows để chuẩn bị dữ liệu (Dịch vụ xử lý mỗi yêu cầu trong 30sek - 1min).

thử của tôi đầu tiên dựa trên mẫu này: https://github.com/MassTransit/Sample-RequestResponse

[HttpPost] 
    public async Task<HttpStatusCodeResult> GenerateReport(string someJsonData) 
    {  
     var serviceAddress = new Uri(ConfigurationManager.AppSettings["BaseLineRecordService"]); 
     var client = this.Bus.CreateRequestClient<ICreateReportRequest, ICreateReportResponse>(serviceAddress, TimeSpan.FromHours(1)); 
     ICreateReportResponse response = await client.Request(new CreateReportRequest()); 
     reportHub.ShowRepordData(response); // Update data by SingleR 
     return new HttpStatusCodeResult(200); 
    } 

Nhưng như tôi hiểu nó không phải là một phương pháp tốt hơn, bởi vì tôi đang giữ kết nối trong tất cả chuẩn bị dữ liệu.

Tôi đã đọc nhiều bài viết và tôi đã tìm thấy ba cách. Cách nào được ưu tiên hơn?

1) Giống như trên bài viết này http://www.maldworth.com/2015/07/19/signalrchat-with-masstransit-v3/

enter image description here

2) Như đầu tiên nhưng với Rest API gọi thay vì người tiêu dùng từ IIS bên

enter image description here

3) Ý tưởng từ bài viết này http://weblog.west-wind.com/posts/2013/Sep/04/SelfHosting-SignalR-in-a-Windows-Service

enter image description here

Trả lời

6

Tôi làm điều này bằng cách sử dụng các trung tâm từ SignalR và quan sát các sự kiện tại máy chủ bằng cách sử dụng người dùng MassTransit thông thường. Khi các sự kiện được quan sát, tôi kích hoạt trình xử lý sự kiện, điều này gửi đi bằng cách sử dụng Hub cho các máy khách được kết nối. Bằng cách đó, các sự kiện được đẩy xuống trình duyệt ngay lập tức mà không cần thoát khỏi cuộc gọi không đồng bộ đang chờ xử lý tại máy chủ trong bộ điều khiển.

Bạn có thể thấy điều này trong Fooidity mà làm điều gì đó tương tự:

https://github.com/phatboyg/Fooidity/blob/develop/src/Fooidity.Management.Web/Hubs/ApplicationHubEventHandler.cs#L18

Sử dụng GlobalHost để giải quyết các Hub, sau đó nâng cao phương pháp trên hub. Ngữ cảnh sự kiện có thể bị phân biệt đối xử bằng cách sử dụng các nhóm, đó là một tính năng SignalR được xử lý trên mỗi nút. Vì vậy, miễn là mọi nút đang quan sát sự kiện, khách hàng có thể được kết nối với bất kỳ trung tâm nào và được thông báo. Điều này làm việc tốt cho cân bằng tải, mà không cần phải sử dụng một backplane cụm nặng cho SignalR - kể từ khi RabbitMQ là siêu nhẹ để phân phối sự kiện.

Bạn cũng có thể thực hiện với hàng đợi không bền, điều này làm cho nó thậm chí còn nhanh hơn - vì việc khôi phục cài đặt/kết nối máy chủ có nhiều khả năng xảy ra hơn là sự cố môi giới.

xác thực được xử lý bên trong ApplicationHub, như thể hiện trong các tập tin nguồn liền kề: https://github.com/phatboyg/Fooidity/blob/develop/src/Fooidity.Management.Web/Hubs/ApplicationHub.cs

Kiểm tra nó ra, hy vọng nó giúp.

+0

Xin chào Chris, tôi rất mong nhận được phản hồi của bạn, cảm ơn rất nhiều! –

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