最近一直在学习WCF相关知识;本文章将针对并发与限流知识进行一个梳理,由于很多理论的知识所以做一个简单的记录,为今后回顾做一个记录;
一:并发知识
WCF将服务实例封装在一个称为实例上下文的对象中,并发是指同一个服务实例上下文同时处理多个服务调用请求;
WCF提供三种不同的实例上下文模式分别为:Per-Call,Per-Session和Single
WCF并发属于服务自身的行为;因此通过服务行为[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Single)]进行定义;
[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Single)]
public class CalculatorService:ICalculator{ }
WCF并发有三种典型策略分别为:Single(默认),Reentrant和Multiple;定义在System.ServiceModel.ConcurrencyMode枚举进行定义;
(1)Single:此策略是默认形式,一个实例上下文在某个时刻只能用于对单一请求的处理;多个并发的请求会以一种串行的方式进行处理;
(2)Reentrant:此策略跟Single类似;差别是如果服务操作在执行过程中涉及对客户端回调,该实例上下文可以用于其他服务调用请求;
(3)Multipe:一个实例上下文可以同时处理多个服务请求;
回调中的并发:要么极用单向(One-Way)的方式进行回调,要么将服务的并发模式设置为Reentrant或Multiple;
应用在回调类型上[CallbackBehavior(ConcurrencyMode=ConcurrencyMode.Multiple)]
二:限流知识
流量限制是为了实现对现有资源有效利用,从而达到确保服务的可用性和提高整体吞吐的目的;
通过设置ServiceThrottingBehavior三个可读写属性:MaxConcurrentCalls,MaxConcurrentInstances和MaxConcurrentSeesions;
分别代表流量的三个阈值;这三个属性是针对某个ServiceHost宿主而言;[WCF版本不同默认值大小不一样];
(1)MaxConcurrentCalls(默认值16,双核32):当前ServiceHost能够处理的最大并发消息数量;
(2)MaxConcurrentInstances(默认值116,双核232):当前ServiceHost允许存在的服务实例上下文的最大数量;
(3)MaxConcurrentSessions(默认值100,双核200):当前ServiceeHost允许的最大并发会话数量;
编程方式:
using (ServiceHost host = new ServiceHost(typeof(CalculatorService))) { ServiceThrottlingBehavior throttlingBehavior = host.Description.Behaviors.Find<ServiceThrottlingBehavior>(); if (null == throttlingBehavior) { throttlingBehavior = new ServiceThrottlingBehavior(); host.Description.Behaviors.Add(throttlingBehavior); } throttlingBehavior.MaxConcurrentCalls = 50; throttlingBehavior.MaxConcurrentInstances = 30; throttlingBehavior.MaxConcurrentSessions = 20; host.Open(); }
配置方式(宿主):
<behaviors> <serviceBehaviors> <behavior name="throttlingBehavior"> <serviceThrottling maxConcurrentCalls="50" maxConcurrentInstances="30" maxConcurrentSessions="20" /> </behavior> </serviceBehaviors> </behaviors>