加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 将SignalR与Azure表存储一起使用 – 什么架构?

发布时间:2020-12-15 19:48:23 所属栏目:asp.Net 来源:网络整理
导读:我有一个智能网格系统,其中多个硬件设备将原始传感器数据发送到Azure队列.每个设备每分钟发送一个数据包.多个工作者角色处理队列上的数据包并将数据推送到表存储.我有一个Web角色,其中包含用户查看其设备数据的应用程序以及与其智能能源系统相关的大量其他警
我有一个智能网格系统,其中多个硬件设备将原始传感器数据发送到Azure队列.每个设备每分钟发送一个数据包.多个工作者角色处理队列上的数据包并将数据推送到表存储.我有一个Web角色,其中包含用户查看其设备数据的应用程序以及与其智能能源系统相关的大量其他警报和消息.目前,Web应用程序仅以一分钟的间隔使用ajax轮询来获取最新的数据更新以及任何其他消息和警报.我不想使用ajax“pull”,而是使用SignalR代替并在云端可用时“推送”云端的更新.我不确定整体架构的外观.

到目前为止,我已经在我的Web角色中添加了一个SignalR Hub,只是为了看看我是否可以这样做.它工作正常.但是,如果表存储发生更改,如何从此Hub触发更新?我应该使用处理原始数据的工作者角色来托管集线器,然后从Web应用程序(客户端)建立跨域SignalR连接吗?我甚至可以将端点与工作者角色相关联吗?如果我有很多工作者角色,我不能只连接到其中一个,因此错过了其他工作者角色的数据更新?

也许我应该创建一个单独的Web角色来托管SignalR集线器,但是如何将处理原始数据的工作者角色的更改传达给集线器?也许我需要包含另一个Azure Queue,它接收来自Worker Roles的有关数据更新,警报和任何其他消息的消息,并且该队列由SignalR服务器处理.但是,这种方法可以扩展吗?如果我有多个SignalR服务器实例处理消息队列,它们是否会共享相同的端点并且知道实例之间的所有客户端连接?或者,工作者角色本身可以作为客户端连接到SignalR服务器,并将消息从那里转发到客户端.

如果以每分钟一次的可预测速率生成数据,SignalR甚至是正确的方法.也许对于这个常规数据的更新,ajax’pull’是最好的方法,我应该只使用SignalR来处理不常见的警报和消息,但是,我如何将这些事件从Worker Roles传递到SignalR服务器?

什么整体架构适合我的需求?

编辑06-09-2014一半问题解决了

我遇到了http://www.asp.net/signalr/overview/signalr-20/performance-and-scaling/scaleout-with-windows-azure-service-bus,这似乎正是我所追求的.这涉及多个Hub服务器(Web角色)实例的问题.现在我只需要一个可以在Worker Roles上运行的SignalR客户端库,以便他们可以通知Hub新数据可用,然后可以增强Hub类以将新数据路由到适当的连接Web客户端.

编辑06-10-2014找到了可行的解决方案

我已经在我的“什么架构”问题上添加了一个答案.我想我的设置的快速摘要可能会有用.我有许多与不同用户关联的远程设备向Azure队列发布实时数据.发布到这些队列的数据将被许多工作者角色解析并保存到表存储中. Web角色为用户(客户端)提供MVC5 Web应用程序以登录和查看其数据.我想要一种机制,通过该机制,当发布新数据时,任何连接的客户端都将收到实时通知(并且客户端应用程序中的数据表和图表可以相应地更新).事实证明,带有服务总线扩展的SignalR就是答案.

解决方法

我需要的解决方案的第一部分是部署客户端可以连接的SignalR集线器,以接收发送的任何通知.我无法使用基本的SignalR解决方案,因为MVC5 Web应用程序托管在可能有多个实例的Web角色上 – 问题是如何保持所有这些实例同步,以便客户端连接到它们的任何实例’ d仍然收到通知.使用Azure Service Bus的SignalR横向扩展证明是问题的这一部分的答案.有关如何设置的详细信息,请访问: http://www.asp.net/signalr/overview/signalr-20/performance-and-scaling/scaleout-with-windows-azure-service-bus – 设置非常简单.

问题的第二部分是如何生成源自Worker Roles(我的队列数据处理器)的通知.首先,我需要能够在我的工作角色中托管OWIN – http://www.asp.net/aspnet/overview/owin-and-katana/host-owin-in-an-azure-worker-role提供的说明绰绰有余.完成此操作后,我创建了一个空的Hub实例,其名称与我在Web角色上部署的实例相同(它是空的,因为我不希望客户端直接连接到它),并将Startup类更改为:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        String connectionString = "[Service Bus Connection String]";
        GlobalHost.DependencyResolver.UseServiceBus(connectionString,"[App Name]");
        app.MapSignalR();
    }
}

有了这个,如果我想向客户发送通知,从工作者角色,我做的事情如下:

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
context.Clients.All.clientMethod("[Message]");

真正发生的是,消息的副本被推送到背板(服务总线),并被Web角色接收并推送到连接的客户端.实际上,我将检查谁在线(在Web角色中心实例中,我覆盖了OnConnected方法以将用户的连接ID保存在其存储在表存储中的配置文件中),并且仅创建与这些用户相关联的通知以减少SignalR交通.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读