【转载】通过服务端监控结果,说说WCF的并发处理

摘要:
然而,由于并行处理模式,服务操作执行期间的状态管理和多线程安全问题需要由服务开发人员处理。以下描述了通过WCF服务器监视器由三个InstanceContextMode和三个ConcurrencyMode的不同组合生成的并发结果。1.InstanceContextMode单实例模式:每个WCF服务仅生成服务的一个实例(合约类)InstanceContextMode对象·ConcurrencyMode单实例:服务实例InstanceContext对象只能用于在特定时间处理单个请求。

InstanceContextMode表示的是,WCF允许产生可用来处理包含在传入消息中的调用的服务(契约类)的实例InstanceContext模式数,WCF的并发模式ConcurrencyMode是针对某个封装了服务实例的InstanceContext而言的

简单的说,InstanceContextMode表示产生多少个服务实例对象,ConcurrencyMode表示每个服务实例对象的并发控制模式

InstanceContextMode:调用的服务(契约类)的实例模式有三种

Single    单例模式:每个WCF服务创建一个InstanceContextMode对象,服务开始时创建,服务完成时销毁
PerSession会话模式:每一次会话产生一个InstanceContextMode对象,调用代理的Close方法销毁或者调用IsTerminating服务操作销毁;
PerCall单调模式:每一次请求产生一个InstanceContextMode对象,调用完后进行销毁;

ConcurrencyMode :WCF服务对象(InstanceContextMode)的并发行为有三种

Single:一个封装了服务实例的InstanceContext对象在某个时刻只能用于对某一个单一请求的处理,也就是说对于同一个服务实例的多个调用必须排队,直到上一次调用完成后才能继续;
Reentrant:该模式和Single一样,InstanceContext对象在某个时刻只能用于对某一个单一请求的处理。不过有一点不同的是,如果服务操作在执行过程中涉及对外调用(Call Out),该InstanceContext可以用于其它服务调用请求的处理;。在 Single 模式下,当方法调用另外一个服务(Callback是客户端提供的服务)时,方法会阻塞,直到所调用的服务完成。如果方法不能重入,那么因无法接受所调用服务的返回消息(reply message),无法解除阻塞状态而陷入死锁(deadlock)。Reentrant 模式就是为了解决 Single 的这种不足,允许方法重入以完成处理过程。
Multiple:在该模式下,一个InstanceContext可以同时用于处理多个服务请求,所以Multiple并发模式下针对同一个InstanceContext的多个并发请求能够得到及时的处理。不过,由于是并行的处理方式,服务操作执行过程中状态的管理以及多线程的安全问题需要服务开发者自行处理。

下面通过一个WCF服务端监控程序,来说明三种InstanceContextMode与三种ConcurrencyMode的不同组合所产生的并发结果

1、InstanceContextMode.Single 单例模式,每个WCF服务只产生一个服务(契约类)的实例InstanceContextMode对象
   ·ConcurrencyMode.Single:服务实例InstanceContext对象在某个时刻只能用于对某一个单一请求的处理。系统自动加锁,无并发问题
        【转载】通过服务端监控结果,说说WCF的并发处理第1张  

     WCF启动一个线程4来接收客户端 127.0.0.1:7688的Add方法请求,处理完成后接收来自客户端127.0.0.1:7689的Add请求。WCF是以串行排队模式处理请求的

   ·ConcurrencyMode.Reentrant:服务实例InstanceContext对象在某个时刻只能用于对某一个单一请求的处理,该模式允许重入单线程并发处理,有可重入(回调)操作时,此模式才会生效,从回调返回的线程会进入队列尾部排队    
      【转载】通过服务端监控结果,说说WCF的并发处理第2张  

    WCF开启线程4接收客户端127.0.0.1:7582的Add请求,请求处理完成后线程4继续做回调处理,同事开启线程5接收客户端127.0.0.1:7851的请求,这种就是WCF的重入并发机制。

   ·ConcurrencyMode.Multiple:服务实例InstanceContext可以同时用于处理多个服务请求。系统不会自动加锁,服务操作执行过程中状态的管理以及多线程的安全问题需要服务开发者自行处理

      【转载】通过服务端监控结果,说说WCF的并发处理第3张

      线程4接收客户端127.0.0.1:7895的Add请求,同事开启线程5接收127.0.0.1:7894的请求...

2、InstanceContextMode.PerSession 会话模式 每一次会话产生一个InstanceContextMode对象
   ·ConcurrencyMode.Single:每个会话会创建一个InstanceContextMode对象实例,每个会话内同时只会有一个线程操作实例,不允许并发。系统自动加锁,无并发问题。

      【转载】通过服务端监控结果,说说WCF的并发处理第4张
    线程4接收客户端127.0.0.1:7904的Add请求,同时线程5接收127.0.0.1:7905的Add请求...这里的单个服务对象实例并不是并发的,虽然我们看到的是多个线程,这里其实每次会话请求只产生一个服务实例对象,因为请求分别来之127.0.0.1:79004-127.0.0.1:7908五个客户端,所以产生了五个服务实例对象。看线程4处理完来至客户端127.0.0.1:7904的Add请求后,才在处理127.0.0.1:7904的Subtraction请求,所以该处理模式在服务实例内部仍是串行的。对会话而言是并行的。

   ·ConcurrencyMode.Reentrant:每个会话会创建一个InstanceContextMode对象实例,每个会话内同时只会有一个线程操作实例,会话内可接受重入并发。

     【转载】通过服务端监控结果,说说WCF的并发处理第5张

     线程4接收客户端127.0.0.1:7863的Add请求,同时线程5接收127.0.0.1:7864的Add请求...线程4开始执行127.0.0.1:7564的回调请求,同时开启线程3执行来至727.0.0.1:7863的Subtraction请求,这说明,WCF服务实例是重入并发的,但是只有在处理来至同一个客户端的回调请求后才会开启新的线程。

   ·ConcurrencyMode.Multiple:每个会话会创建一个InstanceContextMode对象实例。每个会话内允许多线程并发,系统不会自动加锁,有并发问题

      【转载】通过服务端监控结果,说说WCF的并发处理第6张

线程4接收客户端127.0.0.1:7938的Add请求,同时线程5接收127.0.0.1:7864的Add请求,线程6接收客户端127.0.0.1:7938的Substraction请求,从此看出,来至同一个客户化的请求(会话)并没有出现排队想象,而是并行的。

3、InstanceContextMode.PerCall:单调模式 每一次请求产生一个InstanceContextMode对象
   ·ConcurrencyMode.Single:每一次请求产生一个InstanceContextMode对象,每一个请求内同时只会有一个线程操作实例,不允许并发,系统自动加锁,无并发问题     
      【转载】通过服务端监控结果,说说WCF的并发处理第7张  

      线程4接收客户端127.0.0.1:8002的Add请求,线程5接收客户端127.0.0.1:8001的请求...线程4处理完客户端127.0.0.1:8002的Add请求后,开启线程9接收来至同一客户端127.0.0.1:8002的Subtraction请求,看出每一次请求都会产生一个新的服务实例对象。因为有多客户端所以产生多个服务实例对象,这里表现出一种对外的并行,但是因为服务实例对象不允许并发所以虽然127.0.0.1:8002的Add请求和Subtraction请求是来至同一个客户端的仍出现了排队的现象。

   ·ConcurrencyMode.Reentrant:每一次请求产生一个InstanceContextMode对象,每个请求内同时只会有一个线程操作实例,会话内可接受重入并发。当有回调操作时如果使用Single并发模式的话就会产生死锁(1、调用服务端;2、回调客户端;3、返回服务端,1的时候锁定了,到3的时候就无法执行了,所以死锁了),此时应该用Reentrant并发模式

      【转载】通过服务端监控结果,说说WCF的并发处理第8张

    线程4接收客户端127.0.0.1:7884的Add请求,同时线程5接收来之客户端127.0.0.1:7883的请求,因为是单调的所以,在新的线程6中接收来至客户端127.0.0.1:7884的Subtraction请求,线程4结束客户端客户端127.0.0.1:7884的Add请求,开始处理127.0.0.1:7884的Add的回调请求,在回调请求处理同时,线程6还在处理127.0.0.1:7884的Subtraction请求,这里表现出了回调的并发。

   ·ConcurrencyMode.Multiple:每一次请求产生一个InstanceContextMode对象。每个请求内允许多线程并发,系统不会自动加锁,有并发问题

      【转载】通过服务端监控结果,说说WCF的并发处理第9张

线程4接收来自客户端127.0.0.1:3460的Add请求 线程5接收来至客户端127.0.0.1:3461的Add请求...同时线程6接收客户端127.0.0.1:3460的Subtraction请求,来至同一个客户端127.0.0.1:3460的Add请求与Subtraction请求没有出现排队现象,这里是并发的。

免责声明:文章转载自《【转载】通过服务端监控结果,说说WCF的并发处理》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇JAVA构造多级菜单linux c 线程间同步(通信)的几种方法--互斥锁,条件变量,信号量,读写锁下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

单体架构、SOA、微服务

1、单体架构 2、单体架构的拆分 3、SOA与微服务的区别 4、微服务的优缺点 5、微服务的消息 6、服务集成 7、数据的去中心化 一、单体架构 Web应用程序发展的早期,大部分web工程是将所有的功能模块(service side)打包到一起并放在一个web容器中运行,很多企业的Java应用程序打包为war包。其他语言(Ruby,Python或者C++)...

【Java虚拟机6】Java内存模型(Java篇)

什么是Java内存模型 《Java虚拟机规范》中曾试图定义一种“Java内存模型”(Java Memory Model,JMM)来屏蔽各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。 在此之前,主流程序语言(如C和C++等)直接使用物理硬件和操作系统的内存模型。因此,由于不同平台上内存模型的差异,有可能导致程序...

Linux下安装RabbitMQ

前言 RabbitMQ是一个开源的消息中间件,采用 Erlang 语言进行编写,因此RabbitMQ的安装需要依赖Erlang,现在我们将在 Linux 下进行安装RabbitMQ。 本人环境:CentOS 6.5 64位 安装Erlang 在安装Erlang的时候,有很多种方法,最开始我是想按照官网先下载Erlang安装包,然后再进行安装。但发现下载Er...

MQTT协议学习及实践(Linux服务端,Android客户端的例子)

前言 MQTT(Message Queuing Telemetry Transport),是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。MQTT是专门针对物联网开发的轻量级传输协议。MQTT协议针对低带宽网络,低计算能力的设备,做了特殊的优化,使得其能适应各种物联网应用场...

轻量级锁,偏向锁,重量级锁

轻量级锁,偏向锁,重量级锁 参考视频:https://www.bilibili.com/video/BV16J411h7Rd 对象头信息: normal,正常对象,使用markwork的最后3bits来标记,001就表示正常对象 Biased,偏向锁标记,使用markwork的最后3bits来标记,跟正常对象虽然有区别,但区别不大,101就表示偏向锁...

Java 9 揭秘(19. 平台和JVM日志)

Tips做一个终身学习的人。 在这章中,主要介绍以下内容: 新的平台日志(logging)API JVM日志的命令行选项 JDK 9已经对平台类(JDK类)和JVM组件的日志系统进行了大整。 有一个新的API可以指定所选择的日志框架作为从平台类记录消息的日志后端。 还有一个新的命令行选项,可以从所有JVM组件访问消息。 在本章中,详细介绍两个记录工具...