如何在 .NET Core Web API 中配置并发?

Posted

技术标签:

【中文标题】如何在 .NET Core Web API 中配置并发?【英文标题】:How to configure concurrency in .NET Core Web API? 【发布时间】:2017-11-07 13:04:35 【问题描述】:

在过去的 WCF 时代,您可以通过 MaxConcurrentCalls 设置控制服务并发。 MaxConcurrentCalls 默认为 16 个并发调用,但您可以根据需要提高或降低该值。

如何在 .NET Core Web API 中控制服务器端并发?在我们的例子中,我们可能需要限制它,因为太多的并发请求会阻碍整体服务器性能。

【问题讨论】:

【参考方案1】:

ASP.NET Core 应用程序并发由其web server 处理。例如:

红隼

var host = new WebHostBuilder()
    .UseKestrel(options => options.ThreadCount = 8)

由于基于 Kestrel 异步实现,不建议将 Kestrel 线程数设置为像 1K 这样的大值。

更多信息:Is Kestrel using a single thread for processing requests like Node.js?

在 ASP.NET Core 2.0 Preview 2 中,新的 Limits 属性为 introduced。

您现在可以为以下内容添加限制:

    最大客户端连接数 最大请求正文大小 最大请求正文数据速率

例如:

.UseKestrel(options =>

    options.Limits.MaxConcurrentConnections = 100;

IIS

当 Kestrel 在反向代理后面运行时,您可以调整代理本身。例如,您可以在web.configaspnet.config 中配置IIS 应用程序池:

<configuration>
  <system.web>
    <applicationPool
        maxConcurrentRequestsPerCPU="5000"
        maxConcurrentThreadsPerCPU="0"
        requestQueueLimit="5000" />
  </system.web>
</configuration>

当然 NginxApache 有自己的并发设置。

【讨论】:

如果我将更改添加到 aspnet.config,如何应用它们?重启服务器?重启iis?回收应用池? 有谁知道当请求进来并且服务器已经在运行最大线程数时 Kestrel web 主机的行为是什么?

以上是关于如何在 .NET Core Web API 中配置并发?的主要内容,如果未能解决你的问题,请参考以下文章