Pro*_*rod 6 asp.net-mvc azure-storage signalr
我有一个智能网格系统,其中多个硬件设备将原始传感器数据发送到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 仍然收到通知。事实证明,SignalR 与 Azure 服务总线的横向扩展可以解决这部分问题。有关如何设置的详细信息,请访问:http://www.asp.net/signalr/overview/signalr-20/performance-and-scaling/scaleout-with-windows-azure-service-bus - 它是设置非常简单。
问题的第二部分是如何生成来自工作角色(我的队列数据处理器)的通知。首先,我需要能够在我的辅助角色中托管 OWIN - http://www.asp.net/aspnet/overview/owin-and-katana/host-owin-in-an-azure-worker-中提供的说明角色绰绰有余。完成此操作后,我创建了一个空的 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();
}
}
Run Code Online (Sandbox Code Playgroud)
有了这个,如果我想从工作角色向客户发送通知,我会执行以下操作:
var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
context.Clients.All.clientMethod("[Message]");
Run Code Online (Sandbox Code Playgroud)
真正发生的情况是,消息的副本被推送到背板(服务总线),并由 Web 角色拾取并推送到连接的客户端。实际上,我将检查谁在线(在 Web Role Hub 实例中,我重写 OnConnected 方法以将用户的连接 ID 保存在存储在表存储中的配置文件中),并且仅创建与这些用户关联的通知以减少 SignalR交通。
| 归档时间: |
|
| 查看次数: |
1832 次 |
| 最近记录: |