Как ServiceStack обрабатывает одновременные вызовы?

Как ServiceStack обрабатывает одновременные вызовы? Я ищу эквивалент ConcurrencyMode.Multiple в WCF.

У моих служб WCF этот атрибут установлен:

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

Нужно ли мне включить что-либо в ServiceStack, чтобы заставить его использовать несколько потоков для каждого вызова?

Ответы

Ответ 1

ServiceStack не имеет настраиваемой модели concurrency для AppHost, это зависит от того, какой AppHost вы решили разместить в сервисах ServiceStack с помощью:

Хост ASP.NET(AppHostBase)

Для веб-хостов ASP.NET ServiceStack не создает никаких новых потоков, запросы просто обрабатываются на том же IIS/Nginx/etc ASP.NET HTTP WebWorker, который обрабатывает запрос.

HttpListener Self-Host (AppHostHttpListenerBase)

ServiceStack создает только новый поток Запуск при вызове new AppHost().Start(url). Во время выполнения нет новых потоков, то есть запрос обрабатывается в потоке обратного вызова async HttpListener.

HttpListener Long Running Self-Host (AppHostHttpListenerLongRunningBase)

Это еще один параметр HttpListener для Self-Host для ServiceStack, который использует собственный управляемый ThreadPool для выполнения запроса (освобождение потока обратного вызова async HttpListener). Пул по умолчанию для ThreadPool - это 500, но это настраивается в конструкторе AppHostHttpListenerLongRunningBase(poolSize).

RedisMQ Host (RedisMqServer)

Хорошим вариантом для управления долговременными задачами является делегирование запросов на Redis MQ Host, который является легким MQ-сервером, позволяющим отложить и обработать запросы в управляемых фоновых потоках. По умолчанию RedisMqServer генерирует один фоновый поток для каждого типа сообщения (т.е. Запрос), хотя это настраивается при запуске, например: в приведенном ниже примере 2 фоновых потока используются для обработки PostTwitter запросов, в то время как только один фоновый поток используется для обработки запросов CallFacebook и EmailMessage:

mq.RegisterHandler<PostTwitter>(ServiceController.ExecuteMessage, noOfThreads:2);
mq.RegisterHandler<CallFacebook>(ServiceController.ExecuteMessage);
mq.RegisterHandler<EmailMessage>(ServiceController.ExecuteMessage);