具有MassTransit,RabbitMQ和SignalR的分布式架构

时间:2016-05-26 09:44:22

标签: c# asp.net-mvc rabbitmq signalr masstransit

我正在MassTransitrabbitmq

的帮助下开发分布式应用程序

我必须提供在网页上生成报告而无需通过点击按钮重新加载页面的功能,我也应该调用Windows服务进行数据准备(该服务处理每个请求30秒 - 1分钟)。

我的第一次尝试基于此示例: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);
    }

但据我所知,这不是一种更好的方法,因为我在所有数据准备过程中都保持联系。

我读了很多文章,我找到了三种方法。哪种方式更受欢迎?

1)喜欢这篇文章http://www.maldworth.com/2015/07/19/signalrchat-with-masstransit-v3/

enter image description here

2)作为第一个但是使用Rest API调用而不是IIS端的消费者

enter image description here

3)本文的想法http://weblog.west-wind.com/posts/2013/Sep/04/SelfHosting-SignalR-in-a-Windows-Service

enter image description here

1 个答案:

答案 0 :(得分:7)

我使用SignalR的 hubs 执行此操作,并使用常规MassTransit使用者观察服务器上的事件。当观察到事件时,我触发事件处理程序,该处理程序使用Hub将其分派给连接的客户端。这样,事件就会立即推送到浏览器,而不会在控制器中的服务器上留下等待的异步调用。

你可以在 Fooidity 中看到这个,它做了类似的事情:

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

使用GlobalHost解析集线器,然后在集线器上提升方法。可以通过使用组来区分事件上下文,组是每个节点处理的SignalR特征。因此,只要每个节点都在观察事件,就可以将客户端连接到任何集线器并获得通知。这很适合负载平衡,而不必使用重型集群背板进行SignalR - 因为RabbitMQ是超级轻量级​​的事件分发。

您也可以使用非持久队列来实现,这使得它更快 - 因为服务器重置/连接丢失比代理崩溃更可能。

身份验证在ApplicationHub内部处理,如相邻的源文件所示: https://github.com/phatboyg/Fooidity/blob/develop/src/Fooidity.Management.Web/Hubs/ApplicationHub.cs

检查出来,希望它有所帮助。