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