我有很多在Service Fabric中运行的ASP.NET API解决方案。
在应用程序升级(或VM负载平衡或服务缩减等)上,我想确保没有数据丢失,这基本上意味着任何1.0.0服务实例都需要完成所有仍在运行的请求,然后才能将其删除。同时,可以生成任何新的1.0.1实例。
SF是否可以处理这种情况?
我对here提供的可靠的服务生命周期信息一无所知。同样,在我的请求之外处理CancellationToken是不可行的。另外,我也不想取消任何请求...我希望所有请求都能完成。
答案 0 :(得分:0)
采用RollingUpgrade方法的Service Fabric升级服务实例\副本,这意味着,如果您有多个实例,它将一次拆除一个Upgrade Domain,因此不会有太大的区别,因为其他实例仍会收到请求直到所有实例\副本都得到更新。
您创建的方法效果也不佳,因为10秒钟的延迟将阻止您中断正在处理的请求,但不会阻止您接收到可能会被中断的新请求。
为避免收到有关实例更新的新请求,您可以将取消令牌传递给ASP.NET并创建一个中间件,该中间件检查节点是否正在关闭并拒绝任何新请求,如果请求确实发生,则延迟可能会生效不会花比延迟更长的时间。
如果您关注的不是中断正在处理的请求,则有效地执行此操作的唯一方法是跟踪这些请求,然后等待完成再关闭服务,这是ASP.NET的局限性,不能做很多事情。