我在MassTransitrabbitmq的帮助下开发分布式应用程序
我必须提供在网页上生成报告的能力,而无需通过单击按钮重新加载页面,我还应该调用windows服务来准备数据(该服务处理每个30sek-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/
c# - 具有MassTransit,RabbitMQ和SignalR的分布式架构-LMLPHP
2)作为第一个,但使用rest api调用,而不是从iis端调用使用者
c# - 具有MassTransit,RabbitMQ和SignalR的分布式架构-LMLPHP
3)本文的观点http://weblog.west-wind.com/posts/2013/Sep/04/SelfHosting-SignalR-in-a-Windows-Service
c# - 具有MassTransit,RabbitMQ和SignalR的分布式架构-LMLPHP

最佳答案

我使用signaler的集线器来执行此操作,并使用常规的maststrait消费者观察服务器上的事件。当观察到事件时,我触发事件处理程序,它使用集线器向连接的客户端发送消息。这样,事件会立即下推到浏览器,而不会在控制器中的服务器上留下挂起的异步调用。
你可以在Fooidity看到类似的情况:
https://github.com/phatboyg/Fooidity/blob/develop/src/Fooidity.Management.Web/Hubs/ApplicationHubEventHandler.cs#L18
使用globalhost解析集线器,然后在集线器上提升方法。事件上下文可以通过使用组来区分,这是每个节点所处理的信号特征。因此,只要每个节点都在观察事件,客户端就可以连接到任何集线器并得到通知。这对于负载平衡非常有效,无需为signaler使用大型集群背板——因为rabbitmq对于事件分发是超轻量级的。
您也可以使用非持久队列来完成这一操作,这使得它更快,因为服务器重置/连接丢失比代理崩溃更可能发生。
身份验证在applicationhub中处理,如相邻的源文件所示:
https://github.com/phatboyg/Fooidity/blob/develop/src/Fooidity.Management.Web/Hubs/ApplicationHub.cs
看看吧,希望能帮上忙。

07-24 14:09