【发布时间】:2016-08-04 22:06:54
【问题描述】:
您能否让我更好地了解我们如何在不进行分区的情况下扩展无状态服务?
假设我们在一个集群中有 5 个节点,并且我们有 5 个服务实例。在简单的测试中,一个节点表现得像粘性一样,我发送的所有请求都只由一个节点提供服务。在我们有大量请求进入的场景中,是否可以自动使用其他实例来服务流量。我们如何处理服务结构中的这种横向扩展情况?
谢谢!
【问题讨论】:
标签: azure azure-service-fabric
您能否让我更好地了解我们如何在不进行分区的情况下扩展无状态服务?
假设我们在一个集群中有 5 个节点,并且我们有 5 个服务实例。在简单的测试中,一个节点表现得像粘性一样,我发送的所有请求都只由一个节点提供服务。在我们有大量请求进入的场景中,是否可以自动使用其他实例来服务流量。我们如何处理服务结构中的这种横向扩展情况?
谢谢!
【问题讨论】:
标签: azure azure-service-fabric
通常情况下,无状态 SF 服务不需要使用分区,因此请尽量避免:
more on SF partitioning, including why its not normally used for stateless services
如果您使用 ServiceProxy API,它将保持与集群中给定物理节点的粘性连接。如果您(比如说)公开 HTTP 端点,那么集群中的每个物理实例都会有一个(这意味着您最终一次只能与一个通信,除非您手动循环通过它们)。您可以通过以下方式避免这种情况:
为每个调用创建一个新的代理实例,如果你经常这样做,这往往会很昂贵(或者手动循环遍历实例端点 URL 列表,这可能很乏味和/或很昂贵)
在集群前面放置一个负载均衡器,并配置从客户端到 SF 节点的所有流量以通过它转发。负载均衡器可以配置为 Round-Robin 等样式语义:
祝你好运!
【讨论】:
您可以使用安装在每个节点上的反向代理来查询请求。使用https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-reverseproxy
然后反向代理会为您解析端点。如果您有多个无状态服务实例,那么它会将您的请求转发给一个随机实例。
如果在重负载期间您可以增加服务和代理的实例数,则自动包含新实例。
【讨论】:
我假设您是从集群外部调用您的服务。如果是,则您的问题不是特定于 Service Fabric,而是 Azure VMSS + LB。
Service Fabric 在虚拟机规模集之上运行,这些 VM 在负载均衡器后面创建,当客户端连接到您的服务时,它们会通过负载均衡器创建与您的服务的连接,只要连接打开,负载均衡器分配一个目标 VM 来处理您的请求,并且从您的客户端发出的任何请求,在使用相同的连接(保持活动状态)时,都将由同一节点处理,这就是您的负载转到单个节点的原因。
LB不会轮询请求,因为它们使用相同的连接,这是LB的限制(功能),要解决此问题,您应该打开多个连接或使用多个客户端(实例)。
这是默认分发模式(基于哈希)。您还必须检查 LB 中的路由规则,以检查分发模式是 基于哈希的(5 tuple= ip+port)还是 IP 亲和模式 (仅限 ip),否则来自同一 IP 的多个连接仍将链接到同一节点。
【讨论】: