首页 新闻 会员 周边

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

0
悬赏园豆:10 [已解决问题] 解决于 2020-11-26 17:52

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

qihangnet的主页 qihangnet | 初学一级 | 园豆:193
提问于:2020-11-25 10:54
< >
分享
最佳答案
0

我们进行了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>();
收获园豆:10
dudu | 高人七级 |园豆:31007 | 2020-11-25 11:11
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册