gpt4 book ai didi

c# - PerSession 与 PerCall

转载 作者:太空狗 更新时间:2023-10-29 22:07:23 26 4
gpt4 key购买 nike

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

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

我已将 WCF 服务分成 1 个服务中的 7 个契约(Contract)(即 1 个服务中的 7 个端点),这样每个契约(Contract)都负责自己的领域,例如我有一个销售契约(Contract),所以所有与销售相关的表, 其对应的操作都在销售“限界上下文”内

所以我的 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
}

我对 PerCall 的担忧是,因为我有一个相当大的 DB/WCF 服务,恐怕每次调用消耗的资源量乘以用户数量和他们调用该服务的速率, 太棒了。

我不知道详细信息,但我读到创建 channel 代理是昂贵的操作。

哦,我正在使用手工编码的代理而不是 VS 的添加服务引用来使用我的 WCF 服务。

那么,我的问题是,我应该使用哪个? PerSession 还是 PerCall?

更新:

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

最佳答案

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

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

一些关于When-And-Why的观点,

InstanceContextMode.PerCall

  • 如果您的服务是无状态且可扩展的,即好处类似于 HTTP,因为它也是无状态的。
  • 如果服务有轻量级初始化代码(或根本没有)。
  • 如果您的服务是单线程的。
  • 示例场景:对于 PerCall 中给定时间段内的任何 1000 个客户端请求在这种情况下,100 个事件 调用只会实例化 100 个对象。其次,如果服务器崩溃,则在 PerCall情况下,唯一会发生的错误是 100 个正在进行的实际请求(假设快速故障转移)。其他 900 个客户端可以在下次调用时路由到另一台服务器。

InstanceContextMode.PerSession

  • 如果您的服务必须在来自同一客户端的调用之间保持某种状态。
  • 如果您的服务有轻量级初始化代码(或根本没有)。即使您只是为每个客户端代理获取一个新实例,您仍然要小心在构造函数中使用昂贵的初始化代码。
  • 示例场景:对于 PerSession 中给定时间段内的任何 1000 个客户端请求情况下,您可能在服务器上实例化了 1000 个对象,但实际上只有 100 个在任何时候都处于事件调用状态。从而实例化了PerSession对象可能会浪费资源,并可能影响在负载下处理请求的能力。其次,如果服务器崩溃,则在 PerSession在该服务器上有 session 的所有 1000 个客户端都将丢失他们的 session 并且无法完成他们的工作。

引用链接:

  1. MSDN - WCF Instancing, Concurrency, and Throttling
  2. SO - Per-Call vs Per-Session
  3. MSDN - Using Sessions in WCF context

关于c# - PerSession 与 PerCall,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15104960/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com