使用ServiceProxy.Create

时间:2018-10-23 04:28:10

标签: c# azure azure-service-fabric

我有一个带有5个实例的公共ASP.NET Core服务,每个服务结构群集节点上一个实例。我也有一个只有一个实例的工作程序服务,主要是因为这是一个有状态服务。我想从工作程序服务调用特定的前端实例。

我正在使用以下标准代码创建连接...

IFrontend c = ServiceProxy.Create<IFrontend>(new Uri("fabric:/MyApp/FrontendService"));

这可行,但是将连接到5个ASP.NET Core服务之一,并且可以是其中任何一个。我想连接到特定的一个。您可以在其中提供一些特定格式的服务实例标识符吗?

2 个答案:

答案 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

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/b7cc7df3-9872-4000-8cc6-c48cb47b0b3f/calling-all-stateless-service-instances-via-serviceproxy?forum=AzureServiceFabric

答案 1 :(得分:1)

正如PeterBons所述,对于此类问题没有直接的解决方案,在决定与初始计划相关的任何方法之前,有很多陷阱需要注意,我可以指出一些,也许会帮助您做出更好的选择决定:

  • 不能保证在响应返回时用户已连接到FE1,即使您保持连接打开,连接可能会失败,并且用户可能会在连接发生时连接到FE2,您的响应将被重定向到错误的服务器。
  • 用户可能在重新连接时仍连接到同一节点,但是原始服务可能会移动,这在SF上很常见,如果出现故障或负载平衡,服务会在节点附近移动,在这种情况下,连接可能会断开并在同一节点上重新连接,如果您跟踪该分区,则该分区可能已经在另一个节点上,收到无用的消息。
  • 在将消息发送到FE1时,Worker响应可能会失败,并且您将需要在Worker中处理重试,如果向用户的FE失败,同样会发生,您还必须在其中添加重试逻辑,从而增加了复杂性。

一些可行的方法:

  • 使用中间的消息总线使通信异步,以使两个服务都不关心彼此的状态,从Worker发送到FE的每个响应都是异步的,任何故障都可以在其时间上独立处理。您可能要使用:

    • 每个分区一个消息队列,或者
    • 针对所有分区的单个发布/订阅主题,每个主题都处理随后转发的内容。
  • 或者,可以使用PaaS服务来为您管理该服务,例如Azure SignalR Service,在这种情况下,您只需要为客户提供唯一的标识,工作人员就可以保留它以将答案发送回去