WCF实例上下文模式与并发模式对性能的影响
实例上下文模式
InstanceContextMode 控制在响应客户端调用时,如何分配服务实例。InstanceContextMode 可以设置为以下值:
•Single – 为所有客户端调用分配一个服务实例。
•PerCall – 为每个客户端调用分配一个服务实例。
•PerSession – 为每个客户端会话分配一个服务实例。
InstanceContextMode 的默认设置为 PerSession
并发模式
ConcurrencyMode 控制一次允许多少个线程进入服务。ConcurrencyMode 可以设置为以下值之一:
•Single – 一次可以有一个线程进入服务。
•Reentrant – 一次可以有一个线程进入服务,但允许回调。
•Multiple – 一次可以有多个线程进入服务。
ConcurrencyMode 的默认设置为 Single。
实例上下文模式、并发模式和性能
InstanceContextMode 和 ConcurrencyMode 设置可以相互影响,因此了解它们如何影响性能时,必须同时查看这两个设置。例如,将 InstanceContextMode 设置为 PerCall 时,会忽略 ConcurrencyMode 设置。这是因为,每个客户端调用都将路由到新的服务实例,因此一次只会有一个线程在服务实例中运行。将 InstanceContextMode 设置为 Single 时,仅创建一个服务实例,因此 ConcurrencyMode 会影响应用程序的吞吐量。
将 InstanceContextMode 设置为 Single 的原因很多,其中包括:
- 创建服务实例需要大量的处理工作。当多个客户端访问服务时,仅允许创建一个服务实例可以降低所需处理量。
- 一个服务实例可以创建多个对象。将 ConcurrencyMode 设置为 Single 可以降低垃圾回收成本,因为不必为每个调用创建和销毁服务创建的对象。
- 通过将 ConcurrencyMode 设置为 Single,可以在多个客户端之间共享服务实例。
如果 ConcurrencyMode 和 InstanceContextMode 均设置为 Single,则一次只允许一个客户端调用通过。如果有大量客户端,这可能会导致较大的瓶颈。
将 InstanceContextMode 设置为 Single 并将 ConcurrencyMode 设置为 Reentrant 的性能特征与将ConcurrencyMode 设置为 Single 时相同。这是因为,一次仅允许一个客户端线程进入服务。
InstanceContextMode 设置为 PerCall 时,将为每个客户端调用创建一个新服务实例上下文(默认情况下,这表示一个新服务实例),并在客户端调用完成时销毁该实例。由于服务实例仅在进行调用时可 用,因此在调用完成时,会释放它们可能访问的所有资源。由于为每个调用分配一个新服务实例,因此会产生一些开销。但是,由于每个客户端都获取自己的服务实 例,因此不存在同步问题。当大量客户端调用同时发生时,将创建大量的服务实例。遇此情形时,务必使服务实例仅分配其正常工作所需的那些资源。
如果 ConcurrencyMode 设置为 Multiple,则多个客户端调用可以通过,但开发人员需负责手动同步对共享数据的所有访问。这意味着,一次只有一个线程可以访问共享数据,从而导致访问共享数据的所有调用顺序排队等候。这违背了将 ConcurrencyMode 设置为 Multiple 的初衷。
在 InstanceContextMode 设置为 PerCall 时,ConcurrencyMode 设置对吞吐量没有影响。每个客户端调用都获取自己的服务实例,因此每个服务实例只有一个调用到其中的线程。在 InstanceContextMode 设置为 PerSession 时,每个会话都获取自己的服务实例。有关 会话的更多信息,请参见使用会话(可能为英文网页)。使用 PerSession 时,必须使用支持会话的绑定。下表显示系统提供的哪些绑定支持会话。默认会话设置括在圆括号中。
| 绑定 | 会话(默认) |
|---|---|
| BasicHttpBinding | (无) |
| WSHttpBinding | 无、可靠会话、(安全会话) |
| WSDualHttpBinding | (可靠会话)、安全会话 |
| WSFederationHttpBinding | (无)、可靠会话、安全会话 |
| NetTcpBinding | (传输)、可靠会话、安全会话 |
| NetNamedPipeBinding | 无、(传输) |
| NetMsmqBinding | (无)、传输 |
| NetPeerTcpBinding | (无) |
| MsmqIntegrationBinding | (无) |
| BasicHttpContextBinding | (无) |
| NetTcpContextBinding | (传输)、可靠会话、安全会话 |
| WSHttpContextBinding | 无、可靠会话、(安全会话) |
WCF实例上下文模式与并发模式对性能的影响的更多相关文章
- WCF实例上下文
实例上下文模式(IntanceContext Mode)表示服务端的服务实例与客户端的服务代理的绑定方式. 在WCF中有三种不同的实例上下文模式,单调(Per-Call)模式,会话(Per-Sessi ...
- WCF把书读薄(2)——消息交换、服务实例、会话与并发
上一篇:WCF把书读薄(1)——终结点与服务寄宿 八.消息交换模式 WCF服务的实现是基于消息交换的,消息交换模式一共有三种:请求回复模式.单向模式与双工模式. 请求回复模式很好理解,比如int Ad ...
- React 并发功能体验-前端的并发模式已经到来。
React 是一个开源 JavaScript 库,开发人员使用它来创建基于 Web 和移动的应用程序,并且支持构建交互式用户界面和 UI 组件.React 是由 Facebook 软件工程师 Jord ...
- [WCF编程]7.实例上下文模式
一.实例上下文模式概述 实例上下文(IntanceContext Mode)表示服务端的服务实例与客户端的服务代理的绑定方式. 在实例化服务器对象时,WCF采用了3种不同的模式:单调(Per-Call ...
- [WCF编程]13.并发:服务并发模式
一.概述 传入的客户端调用消息会分发给Windows I/O线程池(线程默认为1000)上的服务实例.多个客户端可以发起多个并发的调用,并且服务可以在多个线程上处理这些请求.如果传入的调用分发给同一个 ...
- Go语言-并发模式-资源池实例(pool)
Go语言并发模式 利用goroutine和channel进行go的并发模式,实现一个资源池实例(<Go语言实战>书中实例稍作修改) 资源池可以存储一定数量的资源,用户程序从资源池获取资源进 ...
- WCF学习之旅—HTTP双工模式(二十)
WCF学习之旅—请求与答复模式和单向模式(十九) 四.HTTP双工模式 双工模式建立在上文所实现的两种模式的基础之上,实现客户端与服务端相互调用:前面介绍的两种方法只是在客户端调用服务端的方法,然后服 ...
- [老老实实学WCF] 第十篇 消息通信模式(下) 双工
老老实实学WCF 第十篇 消息通信模式(下) 双工 在前一篇的学习中,我们了解了单向和请求/应答这两种消息通信模式.我们知道可以通过配置操作协定的IsOneWay属性来改变模式.在这一篇中我们来研究双 ...
- python万能消费框架,新增7种中间件(或操作mq的包)和三种并发模式。
新增的中间件和并发模式见注释. 消息队列中间件方面celery支持的,都要支持.并发模式,celery支持的都要支持. 从无限重复相似代码抽取框架,做成万能复用,是生产力的保障. 使用模板模式使加新中 ...
随机推荐
- ubuntu下配置安装PYQT4
apt-get安装(快) sudo apt-get install libxext6 libxext-dev libqt4-dev libqt4-gui libqt4-sql qt4-dev-tool ...
- UITableView表格视图、UITableView代理方法及应用
一.基本知识点 UITableView表格视图,是一个可以滚动的界面(理解为垂直滚动的UIScrollView),可展示多行数据,没有行数的限制,只能有一列. 使用UITableView: 1.展示信 ...
- C#中手工进行声明式验证,从此远离if验证
今天在一个ASP.NET MVC Controller Action中写代码时,需要对ViewModel的字段进行验证.但这个Action处理的是手工编写的ajax请求(不是表单提交),无法使用ASP ...
- spring mvc 配置对静态资源的访问
在spring mvc的配置文件中做如下配置: 1. <?xml version="1.0" encoding="UTF-8"?> <bean ...
- [Android] Android Sutdio on Surface Pro 3
Install Android Studio http://www.android-studio.org/index.php/download/androidstudio-download-baidu ...
- iOS僵尸对象之研究
Zombie Objects对象研究 一.Xcode 关闭ARC project -> Build settings 搜索 Automatic Reference Counting ...
- C语言实现二叉树-02版
---恢复内容开始--- 昨天,提交完我们的二叉树项目后,今天早上项目经理早早给我打电话: 他说,小伙子干的不错.但是为什么你上面的insert是recusive的呢? 你难道不知道万一数据量大啦!那 ...
- Atitit.js图表控件总结
Atitit.js图表控件总结 1. 为什么要使用图表1 2. 图表分类1 3. 数据可视化的优点1 4. 流行的js图表类库1 5. 参考2 1. 为什么要使用图表 因为要可视化 2. 图表分类 条 ...
- atitit.软件开发方法总结O6
atitit.软件开发方法总结O6 #--cmm/cmmi 都晓得这个. #--IPD集成产品开发 结构化的流程 IPD工具:包括业务及技术上的共工具. 5.考评:包括团队和个人绩效考核两个方面:首 ...
- iOS-APP发布应注意要点
Android和IOS的app发布的流程有一个相同之处,就是都需要先将编译好的app签名,然后上传到market里,但两者的复杂度是冰火两重天.Android可以手动通过集成在eclipse里的工具进 ...