【问题标题】:Load balancing a service fabric StatelessService with ServicePartitionClient使用 ServicePartitionClient 对服务结构 StatelessService 进行负载平衡
【发布时间】:2017-03-25 03:58:58
【问题描述】:

我正在服务结构集群上实现 API 网关,其中 API 网关服务是将外部 HTTP 请求路由到集群中运行的一组工作服务的公共端点。对于网关和内部服务之间的服务间通信,我们使用 ServicePartitionClient。

我发现,当使用 ServicePartitionClient 解析服务地址并与无状态服务通信时,它会选择无状态服务的单个实例,并且每次尝试通信时只与该实例通信。就我而言,我有多个无状态服务实例正在运行,并希望在它们之间分配负载(例如循环)。有没有办法使用 ServicePartitionClient 来做到这一点,并且不需要每次都访问 NamingService 服务(这对于我们的用例来说太贵了)?

【问题讨论】:

    标签: azure-service-fabric


    【解决方案1】:

    为每个请求创建一个新的 ServicePartitionClient 实例。

    ServicePartitionClient 是一个相对轻量级的数据结构,它只保存一些关于通信通道的元数据。实际的连接管理、池化和解析名称缓存发生在下面的层中:

    • FabricClient 缓存已解析的端点,因此您不会在每次请求端点时都访问命名服务。
    • ServicePartitionResolver 使用基于我们知道的常见连接异常的基本重试循环包装 FabricClient。
    • CommunicationClientFactoryBase,如果您正在使用它,它会为您保留一个 ServicePartitionResolver 实例并缓存连接。

    因此,请确保您正在重用您的 CommunicationClientFactory。如果你使用的是 CommunicationClientFactoryBase 并且你没有传入你自己的 ServicePartitionResolver,它默认使用单例。

    【讨论】:

    • 有什么方法可以在不创建新实例的情况下完成相同的结果?在我们的测试中,我们发现仅使用每个 http 请求创建新实例就会降低约 30% 的吞吐量。
    猜你喜欢
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 2016-08-23
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多