首页 > 代码库 > WCF实例上下文模式与并发模式对性能的影响

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实例上下文模式与并发模式对性能的影响