如何配置 WCF 以处理大量并发用户



我们正在开发一个多租户系统,它利用WCF + SQL Azure进行数据访问。基本上,我们在客户端连接到的 Azure 中托管了 WCF 服务,然后此 WCF 服务查询 SQL 数据库以获取数据并将数据返回到客户端。其他一切正常,但我们在客户端和 WCF 之间的通道方面存在一些奇怪的性能问题。

似乎如果有足够多的并发用户使用我们的服务,WCF 将开始阻止连接。我所说的"足够"是指大约 20-30 个用户每秒进行大约 1 次查询,这反过来应该是我希望 WCF 能够毫无问题地处理的事情。每个查询在 WCF 服务中花费的时间不到 1 秒,通常为 100 到 200 毫秒。

我们认为 WCF 阻止连接的原因是:

  1. 我们正在记录在 WCF 服务中花费的时间以及WCF 调用总共需要,并且两者之间存在实质性差异这些。例如,在 WCF 服务中花费的时间可以是 100 毫秒,而总时间(从客户的角度来看)可能是5000毫秒甚至10000毫秒。
  2. 客户端可能运行良好,直到它首先命中穗。连续调用将花费很长时间,甚至超时。
  3. 有时客户端根本无法连接到服务。

WCF 服务正在使用 netTcpBinding,并配置了以下设置:

ServicePointManager.DefaultConnectionLimit = 1024;
netTcpBinding.MaxConnections = 1024;
netTcpBinding.SendTimeout = 5 minutes
netTcpBinding.ReceiveTimeout = 5 minutes
serviceThrottlingBehavior.MaxConcurrentCalls = 1024;
serviceThrottlingBehavior.MaxConcurrentInstances = 1024;
serviceThrottlingBehavior.MaxConcurrentSessions = 1024;

我不确定这是否重要,但所有客户端都在同一个 IP 地址后面。此外,每个请求都会打开和关闭通道(主要是因为 Azure 在连接空闲 1 分钟后关闭连接,我们无法弄清楚如何以可靠的方式处理此问题)。

有什么想法吗?

以下问题与此相关,但它们实际上没有提供答案:如何扩展 SQL Azure?SQL Azure vs WCF Performance

在 WCF 中启用诊断,它将帮助您识别问题。

再次查看您的限制配置:

http://msdn.microsoft.com/en-us/library/ms731379.aspx

http://msdn.microsoft.com/en-us/library/vstudio/ms735114(v=vs.100).aspx

http://www.codeproject.com/Articles/33362/WCF-Throttling

如果要传输大型对象,请将默认的"传输模式"更改为"流式传输"。

最新更新