Azure service fabric 服务结构,优雅地关闭”;旧的;服务实例

Azure service fabric 服务结构,优雅地关闭”;旧的;服务实例,azure-service-fabric,Azure Service Fabric,我有相当多的ASP.NET API解决方案运行在ServiceFabric内部 在应用程序升级(或VM负载平衡或服务向下扩展…)时,我希望确保没有数据丢失,这基本上意味着任何1.0.0服务实例都需要完成所有仍在运行的请求,然后才能删除它们。同时,生成任何新的1.0.1实例是完全可以的 SF有没有办法处理这种情况? 我无法理解所提供的可靠的服务生命周期信息。此外,在我的请求之外处理CancellationToken也是不可行的。我也不想取消任何请求。。。我希望所有这些都能完成。服务结构升级服务实例

我有相当多的ASP.NET API解决方案运行在ServiceFabric内部

在应用程序升级(或VM负载平衡或服务向下扩展…)时,我希望确保没有数据丢失,这基本上意味着任何1.0.0服务实例都需要完成所有仍在运行的请求,然后才能删除它们。同时,生成任何新的1.0.1实例是完全可以的

SF有没有办法处理这种情况?


我无法理解所提供的可靠的服务生命周期信息。此外,在我的请求之外处理CancellationToken也是不可行的。我也不想取消任何请求。。。我希望所有这些都能完成。

服务结构升级服务实例\副本采用RollingUpgrade方法,这意味着,如果您有多个实例,它将一次拆除一个升级域,因此不会有太大区别,因为在更新所有实例\副本之前,其他实例仍将接收请求

您创建的方法也不太有效,因为10秒的延迟将阻止您中断正在处理的请求,但不会阻止您接收可能被中断的新请求

为了避免在正在更新的实例上接收新的请求,您可以将取消令牌传递给ASP.NET,并创建一个中间件来检查节点是否正在关闭并拒绝任何新请求,如果请求的时间不超过延迟,则延迟可能生效


如果您担心的不是中断正在处理的请求,那么有效地执行此操作的唯一方法是跟踪这些请求,然后等待完成,然后再关闭服务,这是ASP.NET的限制,无法做太多

我添加了一个Task.Delay()和10s OnCloseAsync()。当然,这远不是完美的,但至少它提供了一个更高的机会,当前活动的请求优雅地完成。我不确定是否是这样。在文档中,它说先关闭侦听器。仅在调用
OnCloseAsync()
之后。我假设您没有收到任何新消息
OnCloseAsync()
。我还没有对这个行为进行负载测试。它会按UD调用
OnCloseAsync()
,这意味着,一个升级域将同时关闭,因此,其他实例将继续接收工作,而被关闭的实例可以关闭端点以停止接收任何新的调用,但这并不意味着在延迟中设置的10秒等待时间之后,它不会杀死任何飞行中的请求。在高负载情况下,您可能会得到正在处理或排队的请求,并且一些请求可能需要10秒以上的时间,以防网络问题或其他依赖性缓慢。我知道这一点,我欢迎任何真正的解决方案。