负载平衡侦听 URI 前缀的 Azure Service Fabric 服务

Load balancing Azure Service Fabric services listening on URI prefix

场景 1(有效):这里的场景运行良好:我有 2 个可公开访问的无状态服务 Foo 和 Bar

http://clusteruri:8081http://clusteruri:8082 发送请求工作正常,我看到对于 Foo,请求很好地分布在托管两个实例的两个节点之间。

场景 2(不工作):这里是我想启用的场景:再次是 2 个无状态服务 Foo 和 Bar

请注意,这两个服务在 相同端口上侦听,但路径不同 (通过使用构建在 http.sys 之上的主机实现,如 WebListener) .

这里事情开始变得奇怪:似乎 ASF/load 平衡器并没有真正理解它并认为所有 3 个节点都只监听端口 8080 导致一些对 Foo 的请求最终在节点托管 Bar 上结束反之亦然。

似乎 ASF/load 平衡器能够自动处理服务在专用端口上侦听的场景,但并不真正支持在同一端口(但不同路径)上侦听的服务。

我的问题

Service Fabric 没有网络负载平衡器。 Service Fabric 只是在一组 VM 上运行的 clustering/orchestration/application 平台。当你通过 ARM(或 Azure 门户)在 Azure 中创建集群时,你在标准 ARM 模板中获得的资源之一是 Azure 负载均衡器,但它是一个完全独立的东西,只知道你正在部署的 VM ,而不是它们上的服务 运行。负载均衡器的配置是您在 ARM 模板中执行的操作(或再次通过 Azure 门户)。 Service Fabric 不知道负载均衡器。如果您在自己的硬件上设置集群,这与您期望的拓扑相同。

方案 1 在 Azure 中有效而方案 2 无效的原因是因为 Azure 负载均衡器是第 4 层负载均衡器:它了解开放端口但不了解 HTTP 和 URL 等应用程序协议,并且不不知道您的节点上有不同的应用程序 - 它看到的只是开放端口。但是,ALB 确实允许您设置 HTTP probes 来告诉 ALB 将流量发送到哪些节点。

这里有一些可能有用的背景信息:https://azure.microsoft.com/en-us/documentation/articles/service-fabric-connect-and-communicate-with-services/