场景:服务发布至容器成功运行起来,多一段时间再访问时可能会出现服务已被回收,导致服务停止。
场景分析:假设我们的目标是希望服务可以持续运行不中断。这里我们用 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);
}
}