正确规避容器自动回收释放资源

场景:服务发布至容器成功运行起来,多一段时间再访问时可能会出现服务已被回收,导致服务停止。

场景分析:假设我们的目标是希望服务可以持续运行不中断。这里我们用 IIS 举例,在 IIS 中有两参数会触发回收导致场景。“固定时间间隔(分钟)” 与 ”闲置超时(分钟)“。

固定时间间隔(分钟):超过设置的时间后,应用程序池回收,为0时应用程序池不会按固定间隔回收。系统默认设置时间是1740(29小时)。

闲置超时(分钟):超过设置的时间后,应用程序池回收。为0时则不会出现限制超时回收。系统默认设置时间是20分钟。

弄清楚自动回收的原因,我们就可以通过修改配置来规避,当然也可以通过编码解决。

编码解决方案:可以通过在服务启动时,启动一个线程每隔10分钟请求一次自己。时间必须小于自动回收时间,这样就等于持续被访问。

最近一次实现是通过自动任务每格十分钟触发一次请求。

/// <summary>
/// 保持服务持续运行,不被自动回收
/// </summary>
public class KeepLiveWorker : PeriodicBackgroundWorkerBase, ISingletonDependency
{
    private readonly IConfigurationRoot configuration;

    public KeepLiveWorker(AbpTimer timer, IHostingEnvironment env) : base(timer)
    {
        configuration = env.GetAppConfiguration();
        Timer.Period = 600000; //10分钟一次轮询
        //Timer.Period = 10000;
    }

    protected override void DoWork()
    {
        Knock();
    }

    /// <summary>保留请求信息</summary>
    public void Knock()
    {
        var request = new RestRequest("/api/TokenAuth/Knock", Method.GET);
        var client = new RestClient(configuration["App:ServerRootAddress"]);
        var response = client.Execute(request);
    }
}
发布了87 篇原创文章 · 获赞 69 · 访问量 60万+

猜你喜欢

转载自blog.csdn.net/S2T11Enterprise/article/details/103488633