【问题标题】:Long running WCF service block others长时间运行的 WCF 服务阻止其他人
【发布时间】:2017-02-07 10:24:18
【问题描述】:

我通过 ServiceHost 将 InstanceContextMode 设置为 PerSession/PerCall

Description.Behaviors.Find<ServiceBehaviorAttribute>().InstanceContextMode = InstanceContextMode.PerSession;
Description.Behaviors.Find<ServiceBehaviorAttribute>().UseSynchronizationContext = false;
ServiceThrottlingBehavior stb = new ServiceThrottlingBehavior
{
    MaxConcurrentSessions = 1000,
    MaxConcurrentCalls = 1000,
    MaxConcurrentInstances = 1000
};
Description.Behaviors.Add(stb);

每次调用都会创建新的服务实例。但是,据我所知,WCF 服务使用 ThreadPool 中的线程,这些请求将排队到可用线程,直到它决定启动新线程。当有一个服务长时间运行时,它会阻止(一些?)后续请求被处理。

我什至尝试将 ThreadPool.SetMaxThreads() 和 ThreadPool.SetMinThreads() 设置为高值,但仍然没有成功。

那么,处理这类问题有什么好的做法呢?

编辑:我尝试了 PerSession/PerCall 与 ConcurrencyMode 的不同组合,但它不起作用。当我在 IIS 设置中提高数量或最大工作进程时,它唯一的非阻塞

一段时间后编辑:现在我知道不建议在 WCF 服务中运行长时间运行的操作,因为它使用 ThreadPool。由于一个阻塞请求将导致所有后续请求(自动排队到某个有限的线程数量,直到 ThreadPool 决定它应该产生更多线程)。所以我把它留给面临同样问题的人。

【问题讨论】:

  • 什么是来自同一客户端或其他客户端请求的阻止请求?你的消息传递模式是什么?请求/回复、双工等?
  • 我很确定它只针对同一个客户端被阻止
  • 我使用了默认的消息模式(我相信是 Request/Reply ?)
  • 您确定这是 WCF 问题吗?也许请求正在使用数据库,而您正面临数据库锁定问题?
  • 阻塞其他请求的请求是对外部服务的宁静调用。这就是为什么它花了这么长时间@zmbq

标签: c# asp.net wcf


【解决方案1】:

如果您将InstanceContextMode.PerSession 设置为 InstanceContextMode,它会指示服务应用程序在客户端和服务应用程序之间建立新的通信会话时创建新的服务对象。 同一会话中的后续调用由同一对象处理

来自同一客户端的成功请求被阻塞的主要原因是因为它与默认情况下为 Single 的 ConcurrencyMode 有关。这是什么意思?这意味着没有请求/调用可以中断正在进行的服务进程,因为它只使用单个线程来处理第一个请求,其他后续请求被阻塞或排队等待服务可用,如果第一个进程不可用,最终将超时还没有完成。另外服务不允许重入。

如果您想了解是否完整,请查看下面的链接,因为它会相互影响。

InstanceMode and Concurrency Model

【讨论】:

  • 对不起,我粘贴的代码是在我玩过这些参数之后。它仍然被 PerCall 设置阻塞。我将编辑问题。此外,阻塞其他请求的请求是对外部服务的宁静调用,这就是为什么它需要这么长时间。您对导致这种行为的原因有其他想法吗?
  • 你能在你的问题中添加这些细节吗?你的意思是客户端->服务->调用其他服务?它阻止请求的原因有很多。
  • 是的,我们的后端服务之一调用外部服务(如 google.com)并等待响应。这个长操作会阻止其他服务被处理
  • 这不好,因为它通常会占用您服务中的资源。您的客户是否需要等待外部服务结果返回给客户服务?如果没有,请在您的服务中实施“一劳永逸”,这样您的客户就不会阻塞
  • 是的,但这就是我必须处理的遗留代码和架构,所以我担心逻辑无法更改。我只是想知道这种配置是否应该在同一个线程中排队,或者我在某个地方搞砸了......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多