16

ServiceStack 如何处理并发调用?我在 WCF 中寻找等效的 ConcurrencyMode.Multiple 。

我的 WCF 服务具有以下属性集:

   [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext = false)]

我是否需要在 ServiceStack 中启用任何功能以使其每次调用都使用多个线程?

4

1 回答 1

16

ServiceStack 没有每个 AppHost 的可配置并发模型,它取决于您选择托管 ServiceStack 服务的 AppHost:

ASP.NET 主机 (AppHostBase)

对于 ASP.NET Web 主机,ServiceStack本身不会创建任何新线程,请求只是在处理请求的同一 IIS/Nginx/etc ASP.NET HTTP WebWorker 上处理。

HttpListener 自宿主 (AppHostHttpListenerBase)

ServiceStack 仅在您调用时在Startup上创建一个新线程new AppHost().Start(url)。在运行时没有创建新线程,即请求在 HttpListener 异步回调线程上处理。

HttpListener 长时间运行的自主机 (AppHostHttpListenerLongRunningBase)

这是 ServiceStack 的另一个自托管 HttpListener 选项,它使用自己的托管线程池来执行请求(释放 HttpListener 异步回调线程)。ThreadPool 的默认 poolSize 是500 个线程,尽管这可以在AppHostHttpListenerLongRunningBase(poolSize)构造函数中配置。

RedisMQ 主机 (RedisMqServer)

管理长时间运行的任务的一个不错的选择是将请求委托给Redis MQ 主机,它是一个轻量级 MQ 服务器,允许您在托管后台线程中延迟和处理请求。默认情况下,RedisMqServer 为每种消息类型(即请求)生成一个后台线程,尽管这可以在启动时进行配置,例如:在下面的示例中,使用2 个后台线程来处理PostTwitter请求,而每个后台线程仅使用 1 个处理CallFacebookEmailMessage请求:

mq.RegisterHandler<PostTwitter>(ServiceController.ExecuteMessage, noOfThreads:2);
mq.RegisterHandler<CallFacebook>(ServiceController.ExecuteMessage);
mq.RegisterHandler<EmailMessage>(ServiceController.ExecuteMessage);
于 2013-01-09T16:12:30.693 回答