许多并发客户端和数据库访问的WCF服务

问题描述:

我是WCF服务的新手,想知道处理以下问题的最佳方法是什么。许多并发客户端和数据库访问的WCF服务

我有很多客户(〜200 - 〜500),这些客户都在工作日期间不断向我的服务请求提供服务。大多数请求都涉及对基础数据库的询问,以反馈正确的响应。

我所关心的是从传入请求产生的数据库连接的潜在数量。如果所有客户端同时发出请求,那么数据库服务器将受到严重打击。如果可能的话,我想避免与数据库的连接数量很少。

将限制到WCF服务的并发连接的数量,并因此不经意地减少可能的数据库连接数量会更好吗?

我已经看过让服务成为一个单线程来产生线程来完成数据库事务,所以我可以控制线程的数量,但是这是多余的,并且会限制连接到服务足够吗?

非常感谢您的任何建议。

马科斯已经提到的 - WCF有一个内置的服务节流能力,您可以在服务器上的调整。这可以防止您的数据库服务器一次充斥太多的请求。

的默认值是:

<serviceThrottling 
     maxConcurrentCalls="16" 
     maxConcurrentSessions="10" 
     maxConcurrentInstances="26" /> 

有关详细信息,请参阅MSDN docs on ServiceThrottlingBehavior

这意味着WCF最多可同时处理16个呼叫 - 即IF您的WCF服务类允许同时使用多个呼叫者!

与马科斯相反,我会而不是建议使您的WCF服务类成为单身人士。常见的最佳做法是拥有一个简单的WCF服务类,并以每种调用方式使用它 - 例如,每个传入的请求都将获得它自己的,完全独立的新创建的WCF服务类实例 - 达到服务限制行为定义的最大值,并由WCF运行时控制。

如果您将WCF服务类设置为单例,则必须将其并发模式设置为多个 - 但是,您需要特别小心,不要让类中的两个并发线程从相同的值改变相同的值;多线程安全编程是一个重大挑战!或者,您没有将并发模式设置为Multiple,但是您的唯一WCF服务类实例只能以串行方式处理请求,而且一次只能处理一个请求 - 不是很有伸缩性!

每个请求的每个调用和一个服务实例绝对是更简单的方法。通过服务调节和ADO.NET连接池,可以构建一个功能强大且性能良好的环境!更多详情请参阅Dan Rigsby's excellent blog post on WCF service throttling

+1

谢谢马克。随着鲁本斯的文章和你的文章,我更加确信我不会超载数据库,并可以在这方面为最终用户提供更多的控制权。 – Andy 2010-01-27 09:48:55

如果你使用ADO连接到你的数据库,它应该提供一个连接池机制,所以你不需要处理这个。

请阅读这篇文章以了解更多信息:ADO.NET Connection Pooling at a Glance

+1

谢谢鲁本斯,我会配置我的连接设置并强调测试我的服务。 – Andy 2010-01-22 14:43:23

+0

你好@Andy,我在这里看到了所有的帖子,对我非常有帮助。您能否告诉我们如何对服务进行压力测试?有没有软件? – 2015-05-16 15:31:01

我们有类似的情况,我们利用解决我们的WebService到数据库只有一个连接如使用MARS从SqlServer的完美的作品和非常快的。 Sql Server真的知道如何处理你不必考虑的并发查询。

您与避免开放的开销和关闭连接(obviosly连接池有助于在这种情况下)

还要记住在你的web服务类似添加:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, 
     ConcurrencyMode = ConcurrencyMode.Multiple)] 

而且在在配置:

<serviceThrottling maxConcurrentCalls="100" 
maxConcurrentSessions="100" 
maxConcurrentInstances="100" /> 

这个选项里面

<behaviors> 
     <serviceBehaviors> 
     <behavior name="..."> 

希望这有助于:)

+1

我不认为InstanceContextMode = Single是一个非常好的主意 - 它使你的服务类成为单例,因此是一个潜在的坏坏瓶颈。我永远不会那样做。限制行为本身足以防止太多的并发数据库连接。 – 2010-01-22 15:28:53

+0

对于我们来说,单例是完美的,如果你的代码没有任何锁定,让它在同一个对象上运行会产生什么问题?实际上,我们避免每次调用都创建服务对象,并且在压力测试中,我们可以更好地与单例调用。我们的服务只对数据库做SELECT查询,我们没有看到单例给我们带来问题的任何情况。 在你的解决方案中,只有16个查询或10个同时处理,让Sql Server处理100个或更多问题有什么问题?,为避免这个问题,查询必须非常昂贵。 – MarcosMeli 2010-01-22 20:20:06

+1

这实际上正是我需要的建议。我有一个Windows服务托管的WCF服务,资源有限,我想同步自己对这些资源的访问。 “多重”并发设置是我错过了。谢谢。 – 2010-04-09 23:40:41