gpt4 book ai didi

c# - WCF 和 IIS 性能使用任务并行库生成数千个任务

转载 作者:太空宇宙 更新时间:2023-11-03 21:22:29 24 4
gpt4 key购买 nike

我的场景:

用户登录触发 WCF 服务器启动 20 async-tasks .每个单独的任务(在代码中命名为作业)正在调用外部 SOAP 服务。所以对于 1000 个同时登录的用户来说,这意味着 20000 个异步任务。现在我们必须批量调用服务(由于外部限制),以获取分页数据——但是我们可以并行执行。因此,这 20 个任务中的每一个都会产生 10 个自己的任务,这意味着每次登录有 400 个任务 - 1000 个同时登录有 400000 个任务。

我的两个问题:

  1. 这将如何影响我们的 IIS 和服务器性能? 据我了解,如果可能,任务将排队并并行运行 - 建议的任务数量是否有任何限制?

  2. 我在创建这些任务时使用的方法是否正确?它们是否真正运行async(WaitAll 除外)?见下面代码:

为每个要调用的服务创建任务

foreach (var job in jobs)
{
Task.Factory.StartNew(() => job.Fetch());
}

上面调用的 Job 类:

public async void Fetch()
{
var batchList = await FetchBatches();
//saves list to database
MergeAndSaveBatchList(batchList);
}

private async Task<BatchResult> FetchBatches()
{
var taskList = new List<Task<BatchResult>>();
foreach (var batch in _batchesList)
{
//this is calling the external services
taskList.Add(Task.Factory.StartNew(() => batch.Fetch()));
}
await Task.WhenAll(taskList);
return taskList.Select(tl => tl.Result);
}

最佳答案

一些简单的数学:

自 Windows XP 以来的所有 Windows 操作系统产品都使用 IANA 建议的动态/临时端口范围。

每个 TCP/IP 连接都需要一个临时端口来接收响应。连接完成后,它会在 TIME_WAIT 状态下保持 120 秒,然后再释放以供重用。

临时端口的 IANA 范围是 49152 到 65535,总共有 16383 个临时端口。

这意味着在最佳条件下,您的服务器每两分钟可以处理 16383 个连接。

由于 HTTP 连接池,请求和连接之间可能没有直接关联,但我非常担心需要这么多请求的架构会导致 port exhaustion .

现在,如果您向同一个服务发出所有请求,您将面临不同的限制……对同一主机的 HTTP 请求的连接限制,在服务器上默认为 10。当你超过这个限制时,东西就会排队......当你将数千个请求排队到同一主机时,这将导致 Not Acceptable 延迟。你可以fiddle with the limit ,但设置得太高,远程服务器可能会拒绝您的请求。

您不能减少架构中所需的请求数量吗?你引用的数字确实很高。

关于c# - WCF 和 IIS 性能使用任务并行库生成数千个任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29817483/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com