Azure 服务结构无状态服务的扩展

Scaling of Azure service fabric Stateless services

您能否让我更好地了解我们如何在不分区的情况下扩展无状态服务?

假设我们在一个集群中有 5 个节点,并且我们有 5 个服务实例。在简单测试中,一个节点表现得非常粘,我发送的所有请求都只由一个节点提供服务。在我们有大量请求传入的场景中,是否可以自动使用其他实例来为流量提供服务。我们如何处理服务结构中的这种横向扩展情况?

谢谢!

通常不需要为无状态 SF 服务使用分区,因此如果可以的话请避免使用分区:

more on SF partitioning, including why its not normally used for stateless services

如果您使用的是 ServiceProxy API,它将保持与集群中给定物理节点的粘性连接。如果您(比如说)公开 HTTP 端点,那么集群中的每个物理实例都会有一个(这意味着您最终一次只能与一个进行通信,除非您手动循环通过它们)。您可以通过以下方式避免这种情况:

  1. 为每个调用创建一个新的代理实例,如果你经常这样做,这往往会很昂贵(或者手动循环遍历实例端点 URL 列表,这可能很乏味 and/or贵)

  2. 在集群前面放置一个负载均衡器,并将所有从客户端到 SF 节点的流量配置为通过它转发。负载均衡器可以配置为 Round-Robin 等样式语义:

Azure Load Balancer

Azure Traffic Manager

祝你好运!

您可以使用安装在每个节点上的反向代理来查询请求。使用 https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-reverseproxy

然后反向代理为您解析端点。如果您有多个无状态服务实例,那么它会将您的请求转发给随机一个。

如果在重负载期间您可以增加服务的实例数,然后代理会自动包含新实例。

我假设您是从集群外部调用您的服务。如果是,则您的问题不是 Service Fabric 特有的,而是 Azure VMSS + LB。

Service Fabric 在虚拟机规模集之上运行,这些 VM 在负载均衡器后面创建,当客户端连接到您的服务时,它们会通过负载均衡器创建到您服务的连接,只要连接是打开,负载均衡器分配一个目标 VM 来处理您的请求,并且从您的客户端发出的任何请求,在使用相同的连接(保持活动)时,将由同一节点处理,这就是您的负载转到单个节点的原因.

LB 不会循环请求,因为它们使用相同的连接,这是 LB 的一个限制(功能),要解决这个问题,您应该打开多个连接或使用多个客户端(实例) .

这是默认分发模式(Hash-based)。还要检查LB中的路由规则,检查分配模式是Hash-based(5 tuple= ip+port)还是 IP亲和模式(仅限ip),否则来自同一IP的多个连接仍将链接到同一节点。

来源:Azure Load Balaner Distribution Mode