【发布时间】:2018-10-08 15:43:08
【问题描述】:
我将编写一个快速的小型 SF 服务来将服务的端点报告给负载平衡器。这部分很容易理解。面料客户端。查找服务。发现端点。使用负载均衡器 API 做一些事情。
但我希望能够处理正常的排水和关机情况。基本上,捕获并阻止 SF 服务的关闭,直到我的应用程序有机会从池中耗尽与它的连接。
我找不到任何 API 来完成此操作。但我敢打赌,其中一项服务会让我这样做。资源管理员。集群管理器。任何。
有没有人知道如何解决这个问题?
【问题讨论】:
我将编写一个快速的小型 SF 服务来将服务的端点报告给负载平衡器。这部分很容易理解。面料客户端。查找服务。发现端点。使用负载均衡器 API 做一些事情。
但我希望能够处理正常的排水和关机情况。基本上,捕获并阻止 SF 服务的关闭,直到我的应用程序有机会从池中耗尽与它的连接。
我找不到任何 API 来完成此操作。但我敢打赌,其中一项服务会让我这样做。资源管理员。集群管理器。任何。
有没有人知道如何解决这个问题?
【问题讨论】:
据我所知,这在您描述的方式中是不可能的。
Service Fabric 服务可能因多种原因关闭:重新平衡、错误、中断、升级等。根据服务类型(有状态或无状态),它们的关闭例程略有不同(请参阅 more),但通常如果服务replica 正常关闭,则调用OnCloseAsync 方法。在这个方法内部replica 可以执行安全清理。还有第二种情况——replica被强制终止。然后调用OnAbort 方法,文档中没有明确声明您在OnAbort 方法中拥有的保证。
回到你的案例,我可以建议以下模式:
replica 将要在OnCloseAsync 或OnAbort 内部关闭时,它会调用lbservice 并报告它将要关闭。lbservice 重新配置负载平衡器以将此 replica 从请求处理中排除。replica 完成所有已处理的请求并关闭。请注意,您也需要实现启动机制,即当replica 启动时,它会向lbservice 报告它现在处于活动状态。
同时,我想注意到 Service Fabric 已经实现了这种机制。 Here 是如何将 API 管理 与 Service Fabric 结合使用的示例,here 是如何使用 反向代理 来访问 Service Fabric 服务的示例外面。
编辑 2018-10-08
为了抽象接收有关服务端点更改的通知,您可以尝试使用FabricClient.ServiceManagementClient.ServiceNotificationFilterMatched Event。
这个question也解决了类似的情况。
【讨论】: