使用 MassTransit、RabbitMQ 和 SignalR 的分布式架构

Distributed architecture with MassTransit, RabbitMQ and SignalR

我正在 MassTransit and rabbitmq

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

我必须提供在网页上生成报告的能力,无需通过单击按钮重新加载页面,我还应该调用 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/

2) 与第一个一样,但使用 Rest API 从 IIS 端调用而不是消费者

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

我使用 SignalR 的 hubs 执行此操作,并使用常规 MassTransit 消费者观察服务器上的事件。当观察到事件时,我会触发事件处理程序,该处理程序使用集线器向连接的客户端进行调度。这样,事件会立即推送到浏览器,而不会在控制器中的服务器上留下未决的异步调用。

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

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

使用 GlobalHost 解析集线器,然后在集线器上提升方法。可以使用组来区分事件上下文,这是按节点处理的 SignalR 功能。因此,只要每个节点都在观察事件,客户端就可以连接到任何集线器并得到通知。这非常适用于负载平衡,而不必为 SignalR 使用繁重的集群背板——因为 RabbitMQ 对于事件分发来说是超轻量级的。

您也可以使用非持久队列来完成它,这使得它更快——因为服务器 reset/connection 掉线比代理崩溃更有可能。

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

检查一下,希望对您有所帮助。