gpt4 book ai didi

wcf - WCF 实例是如何工作的

转载 作者:行者123 更新时间:2023-12-04 06:06:57 25 4
gpt4 key购买 nike

我试图了解 WCF 的实例是如何工作的。我有一个 WCF 服务,它的 InstanceContextMode 设置为 PerCall(因此对于每个客户端的每次调用都会创建一个新实例)并且 ConcurrencyMode 设置为 Single(因此服务实例一次只执行一个操作调用或不执行操作调用)。

因此,我明白当客户端连接时会创建一个新实例。 但是当客户端离开服务时会发生什么。实例是否死亡。 我问的原因是因为我需要在服务中实现一个 ConcurrentQueue 。因此,客户端将连接到服务并放置大量要处理的数据,然后离开服务。 worker 将在队列中工作。工作完成后,我需要销毁实例。

最佳答案

基本上,从 Juval Lowy 的“WCF 大师类”中学习,按调用激活 是需要扩展的服务的首选,即需要处理大量并发请求。

为什么?

通过每次调用,每个传入请求(达到可配置的限制)都会获得自己的、全新的、隔离的服务类实例来处理请求。实例化一个服务类(一个普通的 .NET 类)并不是一个很大的开销 - WCF 运行时可以轻松管理 10、20、50 个并发运行的服务实例(如果您的服务器硬件可以处理它)。由于每个请求都有自己的服务实例,该实例一次只处理一个线程 - 并且它非常容易编程和维护,不需要繁琐的锁和使其线程安全所需的东西。

使用单例服务( InstanceContextMode=Single )要么是一个可怕的瓶颈(如果你有 ConcurrencyMode=Single - 那么每个请求都被序列化,一个接一个地处理),或者如果你想要不错的性能,你需要 ConcurrencyMode=Multiple ,但这意味着您的服务类有一个实例处理多个并发线程 - 在这种情况下,作为该服务类的程序员,您必须 100% 确保您的所有代码、所有对变量的访问等都是 100%线程安全 - 这确实是一项艰巨的任务!只有极少数程序员真正掌握了这门魔法。

在我看来,与为多线程单例 WCF 服务类创建完全线程安全的实现的要求相比,在每次调用场景中创建服务类实例的开销微不足道。

因此,在您使用中央队列的具体示例中,我会:

  • 创建一个简单的 WCF per-call 服务,该服务从您的客户端调用,并且仅将消息放入队列(以适当的方式,例如可能转换传入数据或其他内容)。这是一个快速的任务,没什么大不了的,没有任何类型的繁重处理 - 因此您的服务类将非常简单,非常直接,创建这些类实例根本没有大的开销
  • 创建一个工作服务(Windows NT 服务或其他东西),然后读取队列并进行处理 - 这基本上完全独立于任何 WCF 代码 - 这只是进行出队和处理

  • 所以我要说的是:尝试将服务调用(提供数据的)与必须建立队列并进行大量处理密集型计算分开 - 拆分职责:WCF 服务应该只接收数据和将它放入队列或数据库中,然后完成它 - 第二个单独的进程应该进行处理/繁重的工作。这使您的 WCF 服务保持精益求精

    关于wcf - WCF 实例是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8247509/

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