我是 WCF 服务的新手,想知道解决以下问题的最佳方法是什么。
我有很多客户(约 200 - 约 500 人),他们在工作日期间都在不断地请求我的服务。大多数请求涉及询问底层数据库以反馈正确的响应。
我关心的是传入请求产生的潜在数据库连接数。如果所有客户端同时发出请求,那么数据库服务器将受到重创。如果可能,我想避免与数据库的连接数过多。
限制与 WCF 服务的并发连接数并因此无意中减少可能的数据库连接数会更好吗?
我考虑过让服务成为一个单例,它生成线程来执行数据库事务,这样我就可以控制线程的数量,但这是否有点过头了,限制与服务的连接就足够了吗?
非常感谢您的任何建议。
最佳答案
正如 Marcos 已经提到的 - WCF 具有内置的服务节流功能,您可以在服务器上对其进行调整。这可以防止您的数据库服务器一次被太多请求淹没。
默认值是:
<serviceThrottling
maxConcurrentCalls="16"
maxConcurrentSessions="10"
maxConcurrentInstances="26" />
参见 MSDN docs on ServiceThrottlingBehavior了解更多详情。
这意味着 WCF 最多同时处理 16 个调用 - 也就是说,如果您的 WCF 服务类一次允许多个调用者!
与 Marcos 相反,我不建议将您的 WCF 服务类设为单例。常见的最佳实践是拥有一个简单的 WCF 服务类,并以每次调用的方式使用它——例如每个传入请求都将获得自己的、完全独立的、新创建的 WCF 服务类实例 - 最大数量由服务节流行为定义并由 WCF 运行时控制。
如果您将 WCF 服务类设置为单例,则必须将其 ConcurrencyMode 设置为 Multiple - 但是您需要格外小心,不要让类中的两个并发线程相互更改相同的值;多线程安全编程是一大挑战!或者您没有将并发模式设置为多个,但是您的一个且唯一的 WCF 服务类实例只能以串行方式一次处理一个请求 - 可扩展性不强!
每次调用和每个请求一个服务实例绝对是更简单的方法。适当的服务节流和 ADO.NET 连接池构成了一个非常强大且行为良好的环境!
另见 Dan Rigsby's excellent blog post on WCF service throttling了解更多详情。
关于c# - 用于许多并发客户端和数据库访问的 WCF 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2116799/