我们正在开发一个利用WCF + SQL Azure进行数据访问的多租户系统。基本上我们在Azure中托管了WCF服务,我们的客户端连接到该服务,然后这个WCF服务向SQL数据库查询数据并将数据返回给客户端。其他所有工作都很好但我们在客户端和WCF之间的通道上有一些奇怪的性能问题。
似乎如果有足够的并发用户使用我们的服务,WCF将开始阻止连接。并且“足够”我的意思是20-30个用户每秒大约进行1次查询,这反过来应该是我希望WCF能够毫无问题地处理的东西。每次查询在WCF服务中花费的时间不到1秒,通常为100到200毫秒。
我们认为WCF阻止连接的原因是:
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分钟后关闭连接,我们无法弄清楚如何以稳健的方式处理此连接)。
有什么想法吗?
以下问题与此相关,但他们确实没有提供答案: How to scale SQL azure? SQL Azure vs WCF Performance
答案 0 :(得分:1)
在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
如果要传输大型对象,请将默认TransferMode更改为Streammed。