我在MassTransit和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
1 回答
我使用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
检查一下,希望它有所帮助 .