首页 文章

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

提问于
浏览
10

我在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 回答

  • 7

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

    你可以在Fooidity中看到这个类似的东西:

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

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

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

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

    检查一下,希望它有所帮助 .

相关问题