2013-11-01 21 views
1

我们正在开发一个利用WCF + SQL Azure进行数据访问的多租户系统。基本上我们有WCF服务托管在我们的客户端连接的Azure中,然后这个WCF服务向SQL数据库查询数据并将数据返回给客户端。其他一切正常,但我们在客户端和WCF之间的通道存在一些奇怪的性能问题。如何配置WCF来处理大量的并发用户?

看来,如果有足够的并发用户使用我们的服务,WCF将开始阻止连接。而“足够”的意思就是像20-30个用户每秒大约1次查询,这反过来应该是我希望WCF能够毫无问题地处理的东西。每个查询在WCF服务中花费的时间少于1秒,通常为100到200毫秒。

为什么我们相信WCF阻止连接的原因是:

  1. 我们记录了时间在WCF服务和 WCF调用将总共花费的时间,并有 它们之间相当大的差异。例如,在WCF服务中花费的时间可能是100ms,并且总时间(从客户的角度来看)可能是5000ms,甚至是10000ms。
  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分钟后关闭了连接,但我们无法弄清楚如何以稳健的方式处理此问题)。

任何想法?

以下几个问题都与此有关,但他们真的不提供答案: How to scale SQL azure? SQL Azure vs WCF Performance

+0

我会看你如何配置WCF。仅通过返回一些静态结果就可以取出SQL。请参阅此答案中的链接。 http://stackoverflow.com/questions/10746424/wcf-operationcontract-tuning-instancing-and-concurrency-with-tsql – Paparazzi

+0

您的服务配置为PerCall,PerSession或Singleton吗? – MarcinJuraszek

+0

@Blam,我们已经把SQL拿出来了(即使是简单的ping方法,睡眠时间为100ms也会导致问题) – user544511

回答