c# - 用于许多并发客户端和数据库访问的 WCF 服务

标签 c# database wcf

我是 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/

相关文章:

c# - 使用serilog关闭asp.net core 2.2中的mvc请求日志记录

c# - 有没有比使用层次结构更好的显示对象的方法?

mysql - 从表中按顺序显示记录而不依赖于表的 id?

wcf - WCF 服务的 REST/SOAP 端点

c# - 如何将 JSON.Net 中的 JObject 转换为 T

c# - 同一类型的多个对象集

MYSQL存储过程查询回退逻辑

java - 我应该如何获取文档字段并在另一个集合的另一个 map 中使用它们?

c# - 从 WCF 服务返回时出现 System.EngineExecutionException

c# - 如何使用反射调用 WCF 服务?