使用 ServicePartitionClient 对服务结构 StatelessService 进行负载平衡
Load balancing a service fabric StatelessService with ServicePartitionClient
我正在服务结构集群上实施 API 网关,其中 API 网关服务是 public 将外部 HTTP 请求路由到一组工作服务的端点 运行 在集群中。对于网关和内部服务之间的服务间通信,我们使用 ServicePartitionClient。
我发现当使用 ServicePartitionClient 解析服务地址并与无状态服务通信时,它会选择一个无状态服务实例,并且在每次通信尝试时仅与该实例通信。就我而言,我有多个无状态服务实例 运行 并且想在它们之间分配负载(例如循环法)。有没有一种方法可以使用 ServicePartitionClient 来做到这一点,而不需要每次都点击 NamingService 服务(这对我们的用例来说太昂贵了)?
为每个请求创建一个新的 ServicePartitionClient 实例。
ServicePartitionClient 是一个相对轻量级的数据结构,它只包含一些关于通信通道的元数据。实际的连接管理、池和解析名称缓存发生在下面的层中:
- FabricClient 缓存已解析的端点,这样您就不会在每次请求端点时都访问命名服务。
- ServicePartitionResolver 使用基于我们已知的常见连接异常的基本重试循环包装 FabricClient。
- CommunicationClientFactoryBase(如果您正在使用它)会为您保留一个 ServicePartitionResolver 实例并缓存连接。
因此,请确保您正在重用您的 CommunicationClientFactory。如果您使用的是 CommunicationClientFactoryBase 并且您没有传入自己的 ServicePartitionResolver,它默认使用单例。
我正在服务结构集群上实施 API 网关,其中 API 网关服务是 public 将外部 HTTP 请求路由到一组工作服务的端点 运行 在集群中。对于网关和内部服务之间的服务间通信,我们使用 ServicePartitionClient。
我发现当使用 ServicePartitionClient 解析服务地址并与无状态服务通信时,它会选择一个无状态服务实例,并且在每次通信尝试时仅与该实例通信。就我而言,我有多个无状态服务实例 运行 并且想在它们之间分配负载(例如循环法)。有没有一种方法可以使用 ServicePartitionClient 来做到这一点,而不需要每次都点击 NamingService 服务(这对我们的用例来说太昂贵了)?
为每个请求创建一个新的 ServicePartitionClient 实例。
ServicePartitionClient 是一个相对轻量级的数据结构,它只包含一些关于通信通道的元数据。实际的连接管理、池和解析名称缓存发生在下面的层中:
- FabricClient 缓存已解析的端点,这样您就不会在每次请求端点时都访问命名服务。
- ServicePartitionResolver 使用基于我们已知的常见连接异常的基本重试循环包装 FabricClient。
- CommunicationClientFactoryBase(如果您正在使用它)会为您保留一个 ServicePartitionResolver 实例并缓存连接。
因此,请确保您正在重用您的 CommunicationClientFactory。如果您使用的是 CommunicationClientFactoryBase 并且您没有传入自己的 ServicePartitionResolver,它默认使用单例。