wcf 并发性
wcf服务缺省会保护并发性访问
并发性的模式
ConcurrencyMode枚举Singal(缺省)、Reentrant、Multiple
1、Single并发模式
并发的请求不会被同一个服务实例处理
当服务实例处理请求时,会对其加锁,其他的线程将会排队,除非超时
请求结束时,锁被释放,队列在那个的下一个线程可以访问该对象
Single并发与实例模型的关系
Single与PerCall
对于PerCall服务,每个线程都将分配新的服务实例,不会产生并发性问题
Single模式不会对吞吐量产生影响
可以处理并发访问
Single并发与PerSession
对于PerSession服务,保护服务实例不会受到多线程客户端的影响
Single模式会对单一客户端的吞吐量产生影响
多客户端可以并发访问
可以处理并发访问
Single并发与单件(Singleton)
对于单件服务,保护服务实例不会受到任何并发访问的影响
Single模式会对单件的吞吐量产生影响
多线程和多客户端无法同时访问
限制并发访问的处理
2、Reentrant并发模式
Reentrant是可重入的单线程模式
Reentrant模式主要用于当服务发起回调到客户端时的场景,当回调操作不是one-way操作时
服务在推出时释放锁以发起回调操作,使得另一个线程能够获得锁,从回调返回的线程会进入队列
Reentrant与不同的实例模型的关系
与PerCall的关系
PerCall服务也可能需要重入
在Single模式中,会产生死锁
在Reentrant模式中,没有问题
与PerSession和SingleTons的关系
PerSession服务允许多线程客户端访问服务实例
SingleTon服务允许任何线程访问该服务实例
3、Multiple并发模式
Multiple并发模式可以增加吞吐量,带有多线程客户端的PerSession服务,处理大量客户端的Singleton服务
当服务实例处理请求是,不会自动加锁
多线程同时访问服务实例,共享资源必须得到保护,需要自定义实现多线程保护
自定义实现多线程的方式(信号量,加锁(lock),Monitor,Interlocked)
wcf 实例限流
允许多并发访问以增加服务的整体吞吐量
吞吐量受到很多因素的影响:实例模式,并发模式,限流模式
ServiceThrottleBehavior
ServiceThrottleBehavior提供了很多吞吐量的控制的设置
MaxConcurrencyCalls:限制某一个服务的并发请求数量,缺省为16
MaxConcurrentInstances:限制服务实例的数量,缺省为int.MaxValue
MaxConcurrentSession:限制活动会话数量,包括传输,可靠性与安全会话和应用程序会话,缺省为10
配置ServiceThrottleBehavior,宿主的配置文件中或者代码中
限流与实例模型的关系
限流与PerCall
MaxConcurrencyCalls与MaxConcurrentInstances控制每个服务的吞吐量。
MaxConcurrentSessions支持传输,可靠性,或者安全会话
限流与PerSession
MaxConcurrencyCalls控制吞吐量
MaxConcurrentInstances应该大于等于MaxConcurrentSessions,后者支持传输,可靠性或者安全会话
限流与单件(Singleton)
MaxConcurrencyCalls控制吞吐量
MaxConcurrentInstances与该模式无关
MaxConcurrentSessions依赖于对于传输,可靠性,安全以及应用程序会话的支持
负载均衡与故障转移
跨服务主机的负载平衡能力会对可扩展性产生影响
会话影响负载平衡,没有会话时,请求能够被直接分配到任何主机上,对于传输层会话,如TCP,需要sticky IP
对于可靠性与安全会话,或者应用程序会话,需要sticky会话
缺省情况下不支持故障转移
负载平衡与实例模型关系
负载平衡与PerCall
负载平衡与PerSession
负载平衡与传输会话
负载平衡与可靠性或者安全性会话