代码之家  ›  专栏  ›  技术社区  ›  Phil Wright

使用ServiceProxy连接到特定服务实例。创建

  •  0
  • Phil Wright  · 技术社区  · 6 年前

    我有一个带有5个实例的公共ASP.NET核心服务,每个服务结构群集节点上有一个实例。我还有一个只有一个实例的worker服务,它是主实例,因为这是一个有状态的服务。我想从worker服务调用前端的特定实例。

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

    2 回复  |  直到 6 年前
        1
  •  2
  •   Peter Bons    6 年前

    对此没有直接的解决办法。我能想到的一件事是让ASP.NET核心服务向后端发送一条消息,以注册存在的WebSocket,并让该消息包含前端服务正在运行的节点名(通过 ServiceContext.NodeContext.NodeName ).

    然后使用pub/sub机制从后端向所有ASP.NET核心服务实例发送消息(包括要寻址的指定ASP.NET核心服务实例的节点名),如果节点名匹配,则只允许ASP.NET核心服务实例处理消息。

    你可以用 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

        2
  •  1
  •   Diego Mendes    6 年前

    正如彼得伯恩提到的,这种问题没有直接的解决方案,在你决定任何与你最初计划相关的方法之前,有许多需要注意的问题,我可以指出一些,也许会帮助你做出更好的决定:

    • 在重新连接时,用户可能仍连接到同一节点,但原始服务可能会四处移动,这在SF上很常见,即服务在发生故障或负载平衡时会在节点上移动,在这种情况下,如果您跟踪分区,连接可能会断开并重新连接到同一节点,分区可能已经在另一个节点上,正在接收无用的消息。
    • 当将消息发送到FE1时,Worker响应可能会失败,您将需要在Worker中处理重试,如果用户的FE失败,也可能发生同样的情况,您还必须在其中添加重试逻辑,从而增加复杂性。

    一些可能有效的方法:

      • 每个分区一个消息队列或
      • 一个发布/子主题到所有分区,每个分区处理转发到的内容。
    • 或者,可以使用PaaS服务为您管理它,比如 Azure SignalR Service ,在这种情况下,您只需要为客户机提供一个唯一的标识,而工作人员保留该标识就可以发回答案。