我有一个带有5个实例的公共ASP.NET Core服务,每个服务结构群集节点上一个实例。我也有一个只有一个实例的工作程序服务,主要是因为这是一个有状态服务。我想从工作程序服务调用特定的前端实例。
我正在使用以下标准代码创建连接...
IFrontend c = ServiceProxy.Create<IFrontend>(new Uri("fabric:/MyApp/FrontendService"));
这可行,但是将连接到5个ASP.NET Core服务之一,并且可以是其中任何一个。我想连接到特定的一个。您可以在其中提供一些特定格式的服务实例标识符吗?
答案 0 :(得分:2)
对此没有直接解决方案。我能想到的一件事是让ASP.NET Core服务向后端发送一条消息以注册WebSocket存在,并使该消息包括运行前端服务的节点名称(通过ServiceContext.NodeContext.NodeName
)
然后具有发布/订阅机制,以从后端向所有ASP.NET Core服务实例发送发送消息(包括您要寻址的指定ASP.NET Core服务实例的节点名称),并仅允许ASP如果节点名称匹配,则.NET Core服务实例将处理该消息。
您可以为此使用this project
参考文献:
Call a specific instance of a service in Azure Service Fabric
答案 1 :(得分:1)
正如PeterBons所述,对于此类问题没有直接的解决方案,在决定与初始计划相关的任何方法之前,有很多陷阱需要注意,我可以指出一些,也许会帮助您做出更好的选择决定:
一些可行的方法:
使用中间的消息总线使通信异步,以使两个服务都不关心彼此的状态,从Worker发送到FE的每个响应都是异步的,任何故障都可以在其时间上独立处理。您可能要使用:
或者,可以使用PaaS服务来为您管理该服务,例如Azure SignalR Service,在这种情况下,您只需要为客户提供唯一的标识,工作人员就可以保留它以将答案发送回去