我们都知道ASP.NET和ASP.NET Core的服务,在首次访问时是比较慢的,博客园如何实现先对Docker内的ASP.NET Core服务预热然后再加到K8S集群的。
我们进行了3个层面的预热
前2个预热是通过 Warmup 类实现的,参考代码如下
public class Warmup
{
public async Task StartAsync()
{
WarmupThreadPool();
await WarmupEntityFrameworkCoreAsync();
}
private void WarmupThreadPool()
{
if (ThreadPool.SetMinThreads(50, 20))
{
Parallel.For(0, 50, a => Thread.Sleep(1000));
}
}
private async Task WarmupEntityFrameworkCoreAsync()
{
// ...
}
}
上面的实现是在 Startup.Configure 中被调用执行的
if (CurrentEnvironment.IsProduction())
{
app.ApplicationServices.GetRequiredService<Warmup>().StartAsync().Wait();
}
第3个预热是通过 hosted service 实现的,实现代码如下
public class WarmUpTaskService : IHostedService
{
public IServiceProvider Services { get; }
public WarmUpTaskService(IServiceProvider services)
{
Services = services;
}
public async Task StartAsync(CancellationToken cancellationToken)
{
using var scope = Services.CreateScope();
var sp = scope.ServiceProvider;
var siteCategoryService = sp.GetRequiredService<ISiteCategoryService>();
await siteCategoryService.Initialize();
}
}
上面的实现是在 Startup.ConfigureServices 中注入的
services.AddHostedService<WarmUpTaskService>();