我是 WCF 服务的新手,想知道解决以下问题的最佳方法是什么。
我有很多客户(~200 - ~500),他们在工作日期间不断地向我提出服务请求。大多数请求都涉及询问底层数据库以反馈正确的响应。
我关心的是传入请求产生的数据库连接的潜在数量。如果所有客户端同时发出请求,那么数据库服务器将受到严重打击。如果可能的话,我想避免与数据库的愚蠢连接。
限制 WCF 服务的并发连接数是否会更好,从而无意中减少可能的数据库连接数?
我已经考虑过使该服务成为一个单例,它生成线程来执行数据库事务,以便我可以控制线程的数量,但这是否太过分了,限制与服务的连接就足够了吗?
非常感谢您的任何建议。
正如 Marcos 已经提到的 - WCF 具有内置的服务限制功能,您可以在服务器上进行调整。这可以防止您的数据库服务器同时被太多请求淹没。
默认值是:
<serviceThrottling
maxConcurrentCalls="16"
maxConcurrentSessions="10"
maxConcurrentInstances="26" />
See the 有关 ServiceThrotdlingBehavior 的 MSDN 文档 http://msdn.microsoft.com/en-us/library/system.servicemodel.description.servicethrottlingbehavior.aspx更多细节。
这意味着 WCF 最多同时处理 16 个调用 - 即,IF您的 WCF 服务类允许同时多个调用者!
与马科斯相反,我会not建议将您的 WCF 服务类设置为单例。常见的最佳实践是拥有一个简单的 WCF 服务类,并以每次调用的方式使用它 - 例如每个传入请求都将获得其自己的、完全独立的、新创建的 WCF 服务类实例 - 最大数量由服务限制行为定义并由 WCF 运行时控制。
如果您将 WCF 服务类设置为单例,则必须将其 ConcurrencyMode 设置为 Multiple,但是您需要极其小心,不要让类中的两个同时线程相互更改相同的值;或者将其 ConcurrencyMode 设置为 Multiple。多线程安全编程是一个重大挑战!或者您没有将并发模式设置为“Multiple”,但是您的唯一一个 WCF Service 类实例只能以串行方式处理请求,一次一个 - 可扩展性不太好!
每次调用和每个请求一个服务实例绝对是更简单的方法。通过适当的服务限制和 ADO.NET 连接池,可以构建一个非常强大且表现良好的环境!
另请参阅Dan Rigsby 关于 WCF 服务限制的精彩博客文章 http://www.danrigsby.com/blog/index.php/2008/02/20/how-to-throttle-a-wcf-service-help-prevent-dos-attacks-and-maintain-wcf-scalability/了解更多详细信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)