PerSession与PerCall

Nul*_*nce 5 .net c# performance wcf

决定是使用PerSession还是使用PerCall的一般经验法则是什么?

我有一个稍微沉重的(我认为..)WCF服务,包含大约80个表的CRUD方法.

我已将WCF服务分为1个服务中的7个合同(即1个服务中的7个端点),这样每个合同都会处理自己的域,例如我有一个销售合同,所以所有与销售相关的表,以及相应的操作在销售"有界环境"内

所以我的WCF服务结构看起来像这样:

public partial class ABCService : ISalesService
{
   //CRUD methods of all tables related to Sales
}

public partial class ABCService : IMarketingService
{
    //CRUD methods of all tables related to Marketing
}

public partial class ABCService : ICustomerService
{
    //CRUD methods of all tables related to Customer
}

public partial class ABCService : IProductService
{
    //CRUD methods of all tables related to Products
}
Run Code Online (Sandbox Code Playgroud)

我对PerCall的关注是,因为我有一个相当大的DB/WCF服务,我担心每次呼叫所消耗的资源量乘以用户数量和他们调用服务的速率将是太棒了.

我不知道细节,但我已经知道创建一个频道代理是昂贵的操作.

哦,我使用手动编码代理而不是VS的添加服务引用来使用我的WCF服务.

所以,我的问题是,我应该使用哪个?PerSession或PerCall?

更新:

  1. 我不需要在调用之间保持状态.
  2. 我正在使用NetTCP绑定

Har*_*aid 18

在我看来,要做出决定考虑这两点

  1. 用于InstanceContextMode.PerSession- 如果您的用户在服务器上的WCF服务上存储了一些会话值.
  2. 用于InstanceContextMode.PerCall- 如果您的用户在服务器上的WCF服务上没有存储任何会话,即WCF服务要求存储在内存中不需要每个用户设置.需要可扩展性.

关于何时和为什么的一些观点,

InstanceContextMode.PerCall

  • 如果您的服务是无状态且可伸缩的,那么优点与HTTP类似,因为它也是无状态的.
  • 如果服务具有轻量级初始化代码(或根本没有).
  • 如果您的服务是单线程的.
  • 示例场景:对于某种情况下给定时间段内的任何1000个客户端请求PerCall,将只有100个对象实例化为100个活动呼叫.其次,如果服务器崩溃,那么在PerCall情况下,唯一会发生的错误将是正在进行的100个实际请求(假设快速故障转移).其他900个客户端可以在下次呼叫时路由到另一台服务器.

InstanceContextMode.PerSession

  • 如果您的服务必须在来自同一客户端的呼叫之间保持某种状态.
  • 如果您的服务具有轻量级初始化代码(或根本没有).即使您只为每个客户端代理获取一个新实例,您仍然需要注意在构造函数中使用昂贵的初始化代码.
  • 示例场景:对于某种情况下给定时间段内的任何1000个客户端请求,PerSession您可能在服务器上实例化了1000个对象,但在任何时刻只有100个实际处于活动状态.因此,实例化的PerSession对象可能浪费资源,并可能影响在负载下提供请求的能力.其次,如果服务器崩溃,那么在PerSession该服务器上有会话的所有1000个客户端将丢失其会话并且无法完成其工作.

参考链接:

  1. MSDN - WCF实例化,并发和限制
  2. SO - 每次呼叫与每次会话
  3. MSDN - 在WCF上下文中使用会话