WCF Сервис и Потоки - PullRequest
       1

WCF Сервис и Потоки

7 голосов
/ 19 октября 2010

Я создал простой сервис WCF (.NET 3.5), который определяет 10 контрактов, которые в основном являются расчетами по предоставленным данным.В настоящее время я ожидаю, что довольно немногие клиенты будут звонить по некоторым из этих контрактов.Как сделать сервис более отзывчивым?У меня такое ощущение, что служба будет ждать, пока не обработает один запрос на переход к следующему.Как я могу использовать многопоточность в WCF, чтобы ускорить процесс?

Ответы [ 4 ]

21 голосов
/ 19 октября 2010

Хотя я согласен с ответом Джастина , я считаю, что здесь можно пролить немного света на то, как работает WCF.

Вы делаете конкретное утверждение:

У меня такое ощущение, что служба будет ждать, пока не обработает один запрос на переход к следующему.Как я могу использовать многопоточность в WCF для ускорения работы?

Параллельность службы (сколько вызовов она может выполнить одновременно) зависит от значения ConcurrencyMode для ServiceBehavior прилагается к услуге.По умолчанию это значение равно ConcurrencyMode.Single, что означает, что он будет сериализовать вызовы один за другим.

Однако это может быть не такой большой проблемой, как вы думаете.Если InstanceContextMode вашего сервиса равен InstanceContextMode.PerCall, то это не проблема;новый экземпляр вашей службы будет создаваться для каждого вызова и не использоваться для каких-либо других вызовов.

Однако, если у вас есть одноэлементный или основанный на сеансе объект службы, вызовы к этому экземпляру реализации службыбудет сериализован.

Вы всегда можете изменить ConcurrencyMode, но имейте в виду, что если вы это сделаете, вам придется обрабатывать проблемы параллелизма и доступа к вашим ресурсам вручную, как вы явно сказали WCF, что вы будетесделайте это.

Важно не менять их только потому, что вы думаете , что это приведет к повышению производительности.Несмотря на то что не столько для параллелизма, инстанцирующий аспект вашего сервиса во многом является частью идентификации сервиса (если он сеансовый или не на основе сеансов), и их изменение влияет на клиентов, потребляющих сервис, поэтому не делайте этогоэто просто.

Конечно, это ничего не говорит о том, эффективен ли код, который на самом деле реализует сервис.Это определенно то, что нужно рассмотреть, когда вы указываете, что это так.

3 голосов
/ 19 октября 2010

Это определенно преждевременная оптимизация.Сначала внедрите свои услуги и посмотрите, есть ли проблема.

Я думаю, вы обнаружите, что вы ни о чем не беспокоитесь.Сервер не заблокирует ни одного запроса, пока этот запрос обрабатывается.IIS / WCF должны обрабатывать все для вас как есть.

1 голос
/ 19 октября 2010

Я не знаком с WCF, но может ли процесс быть асинхронным? Если вы ожидаете огромный объем данных и интенсивные вычисления, одним из вариантов может быть отправка id, вычисление значений в отдельном потоке, а затем предоставление метода для возврата результата с использованием начального id.

Что-то вроде:

 int id = Service.CalculateX(...);
 ...
 var y = Service.GetResultX(id);
0 голосов
/ 19 июня 2018

По умолчанию значение Instancing - PerSession. См. Службы WCF по умолчанию

Однако, если вы используете привязку сеанса, которая не поддерживает сеансы (например, BasicHttpBinding), или канал / клиент не создает сеанс, то это ведет себя как PerCall

См. [Поддержка сеанса типа привязки] (https://docs.microsoft.com/en-us/dotnet/framework/wcf/system-provided-bindings).

Каждый объект клиента WCF создает сеанс, и для каждого сеанса будет экземпляр сервера с одним потоком, который синхронно обслуживает все вызовы из этого конкретного объекта клиента WCF.

Таким образом, каждый из нескольких клиентов будет иметь свой собственный сеанс и, следовательно, экземпляр и поток сервера по умолчанию и не будет блокировать друг друга. Они влияют только на общие ресурсы, такие как БД, ЦП и т. Д.

См. Использование сессий

Как и другие, вы должны убедиться, что реализация эффективна, ДО того, как вы начнете играть в режимах Instancing и Concurrency.

Вы также можете рассмотреть расчеты на стороне клиента, если нет реальной причины делать вызов серверу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...