WCF实例上下文模式与并发模式对性能的影响

Posted HOT SUMMER

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 的原因很多,其中包括:

  1. 创建服务实例需要大量的处理工作。当多个客户端访问服务时,仅允许创建一个服务实例可以降低所需处理量。
  2. 一个服务实例可以创建多个对象。将 ConcurrencyMode 设置为 Single 可以降低垃圾回收成本,因为不必为每个调用创建和销毁服务创建的对象。
  3. 通过将 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实例上下文模式与并发模式对性能的影响的主要内容,如果未能解决你的问题,请参考以下文章

设计模式-策略模式

Day805.使用设计模式优化并发编程 -Java 性能调优实战

Go 并发模式: context.Context 上下文详解

关于Go语言,你不得不知的并发模式!

并发编程设计模式之保险箱设计

WCF系列教程之WCF实例化