博客园的服务怎么实现预热后加入K8S集群的

2020-11-26 17:05发布

我们都知道ASP.NET和ASP.NET Core的服务,在首次访问时是比较慢的,博客园如何实现先对Docker内的ASP.NET Core服务预热然后再加到K8S集群的。

1条回答
We Are One
2楼-- · 2020-11-26 17:46

我们进行了3个层面的预热

  1. 线程池的预热,相关博问:如何让 ASP.NET Core 应用启动时线程池满血
  2. EF Core 的预热
  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>();
查看更多
登录 后发表回答