Ответ 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);