我们正在开发一个利用WCF + SQL Azure进行数据访问的多租户系统。基本上我们有WCF服务托管在我们的客户端连接的Azure中,然后这个WCF服务向SQL数据库查询数据并将数据返回给客户端。其他一切正常,但我们在客户端和WCF之间的通道存在一些奇怪的性能问题。如何配置WCF来处理大量的并发用户?
看来,如果有足够的并发用户使用我们的服务,WCF将开始阻止连接。而“足够”的意思就是像20-30个用户每秒大约1次查询,这反过来应该是我希望WCF能够毫无问题地处理的东西。每个查询在WCF服务中花费的时间少于1秒,通常为100到200毫秒。
为什么我们相信WCF阻止连接的原因是:
- 我们记录了时间在WCF服务和 WCF调用将总共花费的时间,并有 它们之间相当大的差异。例如,在WCF服务中花费的时间可能是100ms,并且总时间(从客户的角度来看)可能是5000ms,甚至是10000ms。
- 客户端可能正在运行,直到它第一次点击 秒杀。次要呼叫要么需要很长时间,要么甚至超时。
- 有时客户端根本无法连接到服务。
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
我会看你如何配置WCF。仅通过返回一些静态结果就可以取出SQL。请参阅此答案中的链接。 http://stackoverflow.com/questions/10746424/wcf-operationcontract-tuning-instancing-and-concurrency-with-tsql – Paparazzi
您的服务配置为PerCall,PerSession或Singleton吗? – MarcinJuraszek
@Blam,我们已经把SQL拿出来了(即使是简单的ping方法,睡眠时间为100ms也会导致问题) – user544511