我是 WCF 服务的新手,想知道解决以下问题的最佳方法是什么。
我有很多客户(~200 - ~500)在工作日都相当频繁地请求我的服务。大多数请求都涉及询问底层数据库以反馈正确的响应。
我关心的是从传入请求中产生的数据库连接的潜在数量。如果所有客户端同时发出请求,那么数据库服务器将受到重创。如果可能的话,我想避免连接到数据库的愚蠢数量。
限制与 WCF 服务的并发连接数从而在不经意间减少可能的数据库连接数会更好吗?
我已经考虑过使服务成为一个单例,它会产生线程来执行数据库事务,这样我就可以控制线程的数量,但这是否过大并限制了与服务的连接就足够了?
非常感谢您的任何建议。
最佳答案
正如 Marcos 已经提到的 - WCF 具有内置的服务节流功能,您可以在服务器上进行调整。这可以防止您的数据库服务器一次被太多请求淹没。
默认值是:
<serviceThrottling
maxConcurrentCalls="16"
maxConcurrentSessions="10"
maxConcurrentInstances="26" />
有关更多详细信息,请参阅 MSDN docs on ServiceThrottlingBehavior。
这意味着 WCF 最多可以同时处理 16 个调用 - 即 IF 您的 WCF 服务类允许同时调用多个调用者!
与马科斯相反,我会 而不是 建议将您的 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/