我目前在Azure网站上使用signalR,只有一个实例将数据推送到客户端。没问题。
我们将项目拆分为单独的web / worker和wcf角色,以便我们可以独立扩展它们。
网站会像这样工作。
情景A
用户将一些数据提交给Web角色,并将其放入为工作人员A准备好的服务总线队列中,向工作人员A发送一条消息,表明已经添加了一个新项目(以保存轮询)。当工作人员A处理它时,将消息发送回Web角色,然后推送给特定的客户端。
方案B
以wcf角色接收数据,并将其放入为工作人员B准备的不同服务总线队列中,wcf角色向工作人员B发送消息,表明已添加新项目以防空闲。当工作人员B处理它时,向Web角色发送消息并将其推送给特定客户端。
如下图所示:
我将为用户启用用于Web角色的signalR服务总线背板。我不确定的是如何让我的角色在彼此之间进行沟通。
我需要:
web role =>工人A
工人A =>网络角色
wcf role =>工人B
工人B =>网络角色
我是否在网络上创建集线器,工作者A和工作人员B都有服务总线主题?然后以某种方式与signalr .net客户端连接?如何确保它在没有公开公开的情况下发送到Web角色的所有实例?
出于某种原因,数百个客户端通过JavaScript连接到我的Web角色中心似乎很简单,但尝试连接一些内部的客户端,我无法理解它。
答案 0 :(得分:5)
如果有人感兴趣...我最终做的是:
我在Web和Wcf角色上创建了集线器。 Web角色有一个连接,允许/ signalr和web和wcf角色的javascript代理在/ signalr-internal没有。
我使用Azure Service Bus作为背板,让它自动处理web和wcf集线器,无需额外的修补。
在signalR认证中,我探测了连接的来源(即内部端点或外部ssl端点和拒绝/允许基于此访问特定集线器。这使我可以使用.net信号器客户端我的工作人员自动连接/重新连接等
这最终很好地解决了没有问题,并且实施起来很简单。如果我遇到任何问题,我会更新。
编辑#1:
请勿使用此方法!一切都运作得很好,直到你真正将它部署到现场环境中,然后你会遇到许多问题让我想把头发撕掉。
我实际上最终做的事情(完全在现场工作)是使用服务总线主题并为听众创建订阅。这将创建TCP连接,并允许您的通信在内部保持100%,没有任何疯狂的传输或边界问题。
编辑#2:
自从这篇文章以来,事件中心被释放,我们切换了,从未回头。见最后评论
答案 1 :(得分:1)
Peter,实际上要使这种方法起作用,您需要切换到IaaS VM上托管的Web角色或IIS。
目前,网站不支持Azure虚拟网络,这是在Azure上实例之间启用专用网络互连的唯一方法。
您可以将虚拟机,Web和工作者角色添加到虚拟网络中,该网络应该为您提供所需的访问权限,而无需通过公共端点公开所有内容。