WCF并发(Concurrency)的本质

---同一个服务实例上下文(InstanceContext)同时处理多个服务调用请求

引言

服务(Service)的本质就是提供服务消费者期望的某种功能,服务的价值体现在两个方面:服务本身的质量和寄宿服务的平台应付消 费者的数量,并发(Concurrency)的关注的是第二个要素。WCF服务寄宿于资源有限的环境中,要实现服务效用的最大化,需要考虑如何 利用现有的资源实现最大的吞吐量(Throughput)。提高吞吐量就某个寄宿的服务实例(Service Instance)来说,一个重要的途径就是 让它能够同时处理来自各个客户端(服务代理)的并发访问。WCF实现了一套完整的并发控制体系,为你提供了不同的并发模式。

我经常说软件架构是一门权衡的艺术,需要综合考虑各种相互矛盾的因素,找到一种最优的组合方式。提高单个服务实例允许的并发访 问量能够提高整体吞吐量,这样的理论依赖于一种假设,那就是服务端所能使用的资源是无限。我们知道,这种假设无论在什么情况下都 不会成立。如果我们并发量超出了服务端所能承受的临界点,整个服务端将会崩溃。所以,WCF一方面需要允许让单个服务实例并发处理接 收到的多个请求,同时也需要设置一道闸门控制并发的数量。WCF的流量限制(Throttling)体系为你创建了这道闸门。

从本篇文章开始,我将发布一系列的文章对WCF并发架构体系进行深入剖析 ,先来看看并发的基本介绍。

一、同一个服务实例上下文同时处理多个服务调用请求

并发的含义就是多个并行的操作同时作用于一个相同的资源或者对象,或者说同一个资源或者对象同时应付多个并行的请求。对于WCF 的并发来说,这里将的“资源或者对象”指的就是承载服务操作最终执行的服务实例(Service Instance)。而WCF将服务实例封装在一个 称为实例上下文(InstanceContext)对象中,所以WCF中的并发指的是同一个服务实例上下文同时处理多个服务调用请求。

WCF服务端框架一个主要的任务是将接收到的服务调用请求分发给激活的服务实例,调用相应的服务操作并返回执行结果。也就是说, 服务操作的执行最终还是会落实到某个具体的服务实例上。《WCF技术剖析(卷1)》的第9章对WCF的实例化机制进行了深入的剖析,从中 我们知道在WCF服务端框架体系中,激活的服务实例并不是单独存在的,而是被封装在一个被称为实例上下文(InstanceContext)对象中 。WCF提供了三种不同的实例上下模式(Per-Call、Per-Session和Single)实现了不同的服务实例上下文提供机制。

所以,WCF并发框架体系解决的是如何有效地处理被分发到同一个服务实例上下文的多个服务调用请求,这些并行的调用请求可能来自 不同的客户端(服务代理),也可能相同的客户端。WCF并发的本质上可以通过图1体现。

图1 通过一个InstanceContext对多个并发请求的处理

由于WCF的并发处理属于服务本身自身的行为,所以我们通过服务行为(Service Behavior)的形式对采取的并发策略进行控制,而不 同的并发策略定义在相应的并发模式(Concurrency Mode)下面。

时间: 2024-10-12 09:02:16

WCF并发(Concurrency)的本质的相关文章

WCF并发(Concurrency)的本质:同一个服务实例上下文(InstanceContext)同时处理多个服务调用请求

引言 服务(Service)的本质就是提供服务消费者期望的某种功能,服务的价值体现在两个方面:服务本身的质量和寄宿服务的平台应付消费者的数量,并发(Concurrency)的关注的是第二个要素.WCF服务寄宿于资源有限的环境中,要实现服务效用的最大化,需要考虑如何利用现有的资源实现最大的吞吐量(Throughput).提高吞吐量就某个寄宿的服务实例(Service Instance)来说,一个重要的途径就是让它能够同时处理来自各个客户端(服务代理)的并发访问.WCF实现了一套完整的并发控制体系,

并发中的同步--WCF并发体系的同步机制实现

在<WCF 并发的本质>中,我们谈到了WCF提供的三种不同的并发模式,使开发者可以根据具体的情况 选择不同的并发处理的策略.对于这三种并发模式,Multiple采用的并行的执行方式,而Single和 Reentrant则是采用串行的执行方式.串行执行即同步执行,在WCF并发框架体系中,这样的同步机制是如 何实现的呢? 一.Concurrency.Single模式下的同步实现 实际上,WCF并发框架体系下针对Concurrency.Single模式的实现非常简单,其本质就是对 InstanceC

[原创]WCF后续之旅(12): 线程关联性(Thread Affinity)对WCF并发访问的影响

在本系列的上一篇文章中,我们重点讨论了线程关联性对service和callback的操作执行的影响:在service host的时候,可以设置当前线程的SynchronizationContext,那么在默认情况下,service操作的执行将在该SynchronizationContext下执行(也就将service操作包装成delegate传入SynchronizationContext的Send或者Post方法):同理,对于Duplex同行方式来讲,在client调用service之前,如果

ADO.NET Entity Framework深入分析,Part 6–处理并发(Concurrency Handling)

设置并发模式 Entity Framework 实现了乐观的并发模式(Optimistic Concurrency Model).默认情况下,在实体更新数据提交到数据库时,并不会检查并发.对于高频率的并发属性,你需要设置属性的并发模式为Fixed. 这些属性将会加入到T-SQL脚本的WHERE子句部分,用来比较客户端的值和数据库端的值. 示例代码: public void UpdateProduct() { Product product = context.Product.FirstOrDef

WCF后续之旅(12) 线程关联性(Thread Affinity)对WCF并发访问的影响

在本系列的上一篇文章中,我们重点讨论了线程关联性对service和callback的操作执行的影响:在service host的时候,可以设置当前线程的SynchronizationContext,那么在默认情况下,service操作的执行将在该SynchronizationContext下执行(也就将service操作包装成delegate传入SynchronizationContext的Send或者Post方法):同理,对于Duplex同行方式来讲,在client调用service之前,如果

WCF中并发(Concurrency)与限流(Throttling)体系深入解析系列[共7篇]

服务(Service)的本质就是提供服务消费者期望的某种功能,服务的价值体现在两个方面:服务本身的质量和寄宿服务的平台应付消费者的数量,并发(Concurrency)的关注的是第二个要素.WCF服务寄宿于资源有限的环境中,要实现服务效用的最大化,需要考虑如何利用现有的资源实现最大的吞吐量(Throughput).提高吞吐量就某个寄宿的服务实例(Service Instance)来说,一个重要的途径就是让它能够同时处理来自各个客户端(服务代理)的并发访问.WCF实现了一套完整的并发控制体系,为你提

ConcurrencyMode.Multiple 模式下的WCF服务就一定是并发执行的吗:探讨同步上下文对并发的影响[下篇]

在<上篇>中,我通过一个具体的实例演示了WCF服务宿主的同步上下文对并发的影响,并简单地介绍了同步上下文是什么东东,以及同步上下文在多线程中的应用.那么,同步上下文在WCF并发体系的内部是如何影响服务操作的执行的呢?这实际上涉及到WCF的一个话题,即线程的亲和性(Thread Affinity),本篇文章将为你剖析WCF线程亲和机制的本质. 一.WCF线程亲和性(Thread Affinity) 对于服务端来说,WCF消息监听和接收体系通过IO线程池并发的处理来自客户端的服务调用请求,所以并发

WCF后续之旅(11) 关于并发、回调的线程关联性(Thread Affinity)

对于一般的多线程操作,比如异步地进行基于文件系统的IO操作:异步地调用Web Service:或者是异步地进行数据库访问等等,是和具体的线程无关的.也就是说,对于这些操作,任意创建一个新的线程来执行都是等效的.但是有些情况下,有些操作却只能在固定的线程下执行.比如,在GUI应用下,对控件的访问就需要在创建该控件的线程下执行:或者我们在某个固定的线程中通过TLS(Thread Local Storage)设置了一些Context信息,供具体的操作使用,我们把操作和某个固定的线程的依赖称为线程关联性

ConcurrencyMode.Multiple模式下的WCF服务就一定是并发执行的吗:探讨同步上下文对并发的影响[上篇]

在<并发与实例上下文模式>中,我们通过实例演示的方式讲述了基于不同实例上下文模式的并发行为.对于这个实例中的服务类型CalculatorService,读者应该还记得我们对它进行了特别的定义:通过ServiceBehaviorAttribute特性将属性将UseSynchronizationContext设置成False.至于为何要这么做,这就是本篇文章需要为你讲述的内容.为了让读者对本节介绍的内容有一个深刻的认识,我们不然去掉ServiceBehaviorAttribute特性的UseSyn