WCF服务 天生是多线程么 比如:有1万个客户端同时调用WCF上的同一个方法.WCF是如何处理的每一个请求用一个线程,还是一个线程按顺序来执行.如果天生是多线,还用msmq做什么用? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1W个客户端同时凋WCF, 估计服务会被宕掉, 默认是1000个线程 [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)] 我昨天看了付老师的WEBCAST 并发与限流一节, 我觉得他的并发并不是在一个时间有多少客户端连接,而是一个客户端连接上以后对函数调用的次数 原来用过多线程,看懂一点儿,只知道,即使是多线程并发操作,也是分配cup时间的问题,同时只是用户感觉,其实cup是分时处理的,那么多核cup就有优势了,可以有多个cup,多个时间点工作。线程池也是这样工作的。你的程序用线程池托管一下看看,网上找找线程池有答案。 多个客户端同时调用代理类给WCF发送请求,这是WCF处理的,我没法用线程池来做啊. WCF有两处是用来指定是多线程还是单线程的。在你的服务类头上找到"[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]"这样的声明就是多线程的,不过就算你用了单线程,也不代表不能多个用户同时处理,因为还有一处。"[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single,InstanceContextMode = InstanceContextMode.Single)]"只有这样,它启动单例,并在单线程下运行,才能保证用一个线程按顺序来执行每个请求,具体细节自己查看ConcurrencyMode 和InstanceContextMode 的说明。至于要1万个客户端同时连接也可以,只要你的服务器没问题,修改WCF的默认配置文件参数,即可让你不出现#10楼 的那种情况了。这里以net.tcp为例,有个maxConnections属性,默认为10,也就是同时最多10个客户连接,超过就会报服务器太忙的错误,你可以修改这个属性的值,来达到同时更多用户连接。 好像WCF有相关设置MaxPendingChannels参考:Server too busy exception.Best Practices for Reliable Sessions<reliableSession> 能否具体说说这个 maxconnection属性在哪里设置.我找了好大一圈没找着. app.config里,找到 <bindings> <netTcpBinding> <binding name="TcpBinding" maxConnections="1000" transferMode="Buffered" sendTimeout="00:10:00" receiveTimeout="00:10:00" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"> <security mode="Message"> <message clientCredentialType="None"/> </security> </binding> </netTcpBinding> </bindings>显然这个配置文件应该是在开启服务的那个项目中找。 青龙白虎:我加了这个maxconnecton设为1000,但是仍然是报错,大概是处理几十个客户端后报错 csdn的特点就在于:如果你不重点强调“net.tcp协议”,别人就会被你说的“cf服务天生”所彻底误导。 我是用循环建立线程的方式,相当于一下子有几百个消息涌过去了.WCF处理了几十个,问题就来了. 这分明就是socket连接太多后导致的错误嘛.看来分明就是socket. 刚在蒋金楠老师的WCF技术剖析中看到 WCF是基于多线程的通信框架,看来WCF天生就是多线程的了.什么single的实例模式只是多线程同步调用一个服务实例. 按理说,服务器是不会这么烂的,你的测试机是不是XP系统啊,一般服务得运行在Server2003以上的系统上面。另外我不知道你测试的时候是否让CPU很繁忙,你可以考虑调用服务端一个空方法,里面就写一个“System.Threading.Thread.Sleep(10000);”保持10秒连接来测试。 哥们 我想这本身并不是WCF的问题,而是这种无间隔的请求方式本身就是一种攻击行为.而这行为也达到了效果:拒绝服务. WCF的实例化和并发http://msdn.microsoft.com/zh-cn/library/ms731193.aspx并发并发是对 InstanceContext 中在任一时刻处于活动状态的线程数量的控制。此控制是通过将 System.ServiceModel.ServiceBehaviorAttribute.ConcurrencyMode 与 ConcurrencyMode 枚举结合使用来实现的。有以下三种可用的并发模式: * Single:最多允许每个实例上下文同时拥有一个对该实例上下文中的消息进行处理的线程。其他希望使用同一个实例上下文的线程必须一直阻塞,直到原始线程退出该实例上下文为止。 * Multiple:每个服务实例都可以拥有多个同时处理消息的线程。若要使用此并发模式,服务实现必须是线程安全的。 * Reentrant:每个服务实例一次只能处理一个消息,但可以接受可重入的操作调用。仅当服务通过 WCF 客户端对象提供服务时才会接受这些调用。注意:理解和开发能够安全地使用多个线程的代码可能比较困难。在使用 Multiple 或 Reentrant 值之前,应确保已针对这些模式对服务进行了适当设计。有关更多信息,请参见 ConcurrencyMode.并发的使用与实例化模式有关。在 PerCall 实例化过程中,与并发没有关系,因为每个消息都由一个新的 InstanceContext 处理,因此 InstanceContext 中处于活动状态的线程永远都不会超过一个。 InstanceContextMode 默认值为 PerSessionConcurrencyMode 默认值为 Single在默认的情况下,多个客户端(Session)并发请求同一个WCF服务,这也会形成多线程并发(多个服务实例并发),此时,只要服务方法设计为不访问全局资源,对数据库自增ID的访问则采用 TABLOCK 和事务,应是不用怎么考虑多线程同步的问题吧? 服务端线程的数量是有客户端对服务调用的线程数量决定的。例如:如果客户端是单线程对服务的调用,服务端只会分配一条线程给客户端。如果客户端有3条对服务的调用,则会分配3条线程。同时服务端的Throttling的最小配置,也同样会影响线程数。 请问如何用代码触发一个事件? 如何操作内嵌类的反射? 如何在winform页面内传值? 求实现copy paste功能的VS.Net代码 安装vs2008出现错误,cab10.cab数字签名无效,哪位兄弟能发我这个文件,谢谢啊 我的邮箱是[email protected] 一个字符串里有英文也有中文,我想得到这个字符串的Ascii码的长度 怎么样处理连接共享? 我的数据为什么不显示啊(急!!!在线等待!!) <求助>数据库中如何存取图片? 急问题:关于给自定义的控件添加事件的问题! 建表问题。。 C#里ultralGrid控件的ContextMenuStrip如何避免自动弹出
在你的服务类头上找到"[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]"这样的声明就是多线程的,不过就算你用了单线程,也不代表不能多个用户同时处理,因为还有一处。
"[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single,InstanceContextMode = InstanceContextMode.Single)]"只有这样,它启动单例,并在单线程下运行,才能保证用一个线程按顺序来执行每个请求,具体细节自己查看ConcurrencyMode 和InstanceContextMode 的说明。至于要1万个客户端同时连接也可以,只要你的服务器没问题,修改WCF的默认配置文件参数,即可让你不出现#10楼 的那种情况了。这里以net.tcp为例,有个maxConnections属性,默认为10,也就是同时最多10个客户连接,超过就会报服务器太忙的错误,你可以修改这个属性的值,来达到同时更多用户连接。
MaxPendingChannels参考:Server too busy exception.Best Practices for Reliable Sessions<reliableSession>
能否具体说说这个 maxconnection属性在哪里设置.我找了好大一圈没找着.
<bindings>
<netTcpBinding>
<binding name="TcpBinding" maxConnections="1000" transferMode="Buffered" sendTimeout="00:10:00" receiveTimeout="00:10:00" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
<security mode="Message">
<message clientCredentialType="None"/>
</security>
</binding>
</netTcpBinding>
</bindings>显然这个配置文件应该是在开启服务的那个项目中找。
我加了这个maxconnecton设为1000,但是仍然是报错,大概是处理几十个客户端后报错
哥们 我想这本身并不是WCF的问题,而是这种无间隔的请求方式本身就是一种攻击行为.而这行为也达到了效果:拒绝服务.
http://msdn.microsoft.com/zh-cn/library/ms731193.aspx并发并发是对 InstanceContext 中在任一时刻处于活动状态的线程数量的控制。此控制是通过将 System.ServiceModel.ServiceBehaviorAttribute.ConcurrencyMode 与 ConcurrencyMode 枚举结合使用来实现的。有以下三种可用的并发模式: * Single:最多允许每个实例上下文同时拥有一个对该实例上下文中的消息进行处理的线程。其他希望使用同一个实例上下文的线程必须一直阻塞,直到原始线程退出该实例上下文为止。 * Multiple:每个服务实例都可以拥有多个同时处理消息的线程。若要使用此并发模式,服务实现必须是线程安全的。 * Reentrant:每个服务实例一次只能处理一个消息,但可以接受可重入的操作调用。仅当服务通过 WCF 客户端对象提供服务时才会接受这些调用。注意:
理解和开发能够安全地使用多个线程的代码可能比较困难。在使用 Multiple 或 Reentrant 值之前,应确保已针对这些模式对服务进行了适当设计。有关更多信息,请参见 ConcurrencyMode.并发的使用与实例化模式有关。在 PerCall 实例化过程中,与并发没有关系,因为每个消息都由一个新的 InstanceContext 处理,因此 InstanceContext 中处于活动状态的线程永远都不会超过一个。
ConcurrencyMode 默认值为 Single在默认的情况下,多个客户端(Session)并发请求同一个WCF服务,这也会形成多线程并发(多个服务实例并发),
此时,只要服务方法设计为不访问全局资源,对数据库自增ID的访问则采用 TABLOCK 和事务,
应是不用怎么考虑多线程同步的问题吧?
例如:如果客户端是单线程对服务的调用,服务端只会分配一条线程给客户端。
如果客户端有3条对服务的调用,则会分配3条线程。
同时服务端的Throttling的最小配置,也同样会影响线程数。