Как работает параллелизм в WCF? - PullRequest
14 голосов
/ 07 сентября 2010

Я новичок в WCF и SOA.Я только начинаю с них, у меня есть теоретическое сомнение:

Клиент A вызвал службу, и в настоящий момент логика выполняется на сервере.В то время как логика выполняется, для той же услуги приходит другой вызов от Клиента B.

На этом этапе, что происходит с логикой, которая выполняется для Клиента A?Как сервису удается обслуживать оба запроса?

Ответы [ 5 ]

39 голосов
/ 07 сентября 2010

Ответ на ваш вопрос зависит от используемой вами привязки.Есть два параметра, управляющих этим поведением: InstanceContextMode и ConcurrencyMode.Оба эти параметра установлены в ServiceBehaviorAttribute.

InstanceContextMode контролирует, как создается экземпляр службы.Он имеет следующие значения:

  • PerCall - каждый раз, когда вы вызываете сервис, создается новый экземпляр сервиса.Это поведение по умолчанию для служб, предоставляемых для привязок, которые не используют транспортный сеанс, надежный сеанс или сеанс безопасности => BasicHttpBinding, WebHttpBinding.

  • PerSession - каждый раз, когда вы вызываете службу из новогоэкземпляр прокси создан новый экземпляр службы.Любой последующий вызов с того же прокси-сервера обрабатывается тем же экземпляром службы (экземпляр живет на сервере).По умолчанию последующий вызов должен быть выполнен в течение 10 минут (receiveTimeout), или экземпляр службы освобождается.Это стандартное поведение по умолчанию для служб, связанных с привязкой, которые используют транспортный сеанс, надежный сеанс или сеанс безопасности => WSHttpBinding (настройка по умолчанию использует сеанс безопасности), NetTcpBinding, NetNamedPipeBinding.

  • Single - onlyсуществует один экземпляр службы, который обрабатывает все вызовы.Этот экземпляр службы можно создать при запуске хоста или при первом вызове службы.

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

  • Одиночный - только один поток может получить доступ к экземпляру службы.Это поведение по умолчанию.

  • Reentrant - один поток может получить доступ к сервису, но он может снять блокировку и позволить другому потоку использовать экземпляр, пока первый поток будет заблокирован.Это используется в сценарии обратного вызова.

  • Несколько - несколько потоков могут получить доступ к экземпляру службы.

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

  • Создание экземпляров PerCall + Единый параллелизм - типичный сценарий без сохранения состояния.Допускается несколько одновременных вызовов.

  • Создание экземпляров PerCall + Многократный параллелизм - не имеет смысла.Он по-прежнему ведет себя как одиночный параллелизм.

  • Создание экземпляров PerSession + одиночный параллелизм - допускается несколько одновременных вызовов, но одновременно может обрабатываться только один вызов от каждого прокси.Другие вызовы помещаются в очередь.

  • Создание экземпляров PerSession + множественный параллелизм - допускается несколько одновременных звонков.Несколько вызовов от каждого прокси могут одновременно обращаться к одному и тому же экземпляру.Необходимо выполнить ручную синхронизацию доступа к общим полям в экземпляре службы.

  • Одиночное копирование + Одиночный параллелизм - одновременно может обрабатываться только один запрос.Другие запросы ставятся в очередь (время ожидания по умолчанию 30 с).

  • Один экземпляр + Множественный параллелизм - допускается несколько одновременных вызовов.Все вызовы обращаются к одному и тому же экземпляру одновременно.Необходимо выполнить ручную синхронизацию доступа к общим полям в экземпляре службы.

5 голосов
/ 07 сентября 2010

Это зависит от значения свойства ConcurrencyMode атрибута ServiceBehavior, который применяется к реализации службы. Если ConcurrencyMode имеет значение Single, вызов от клиента B будет ожидать завершения вызова от клиента A; если ConcurrencyMode имеет значение Multiple, оба будут выполняться одновременно, но в отдельных потоках.

Если не установлено, для параметра ConcurrencyMode по умолчанию используется значение Single: http://msdn.microsoft.com/en-us/library/system.servicemodel.servicebehaviorattribute.concurrencymode.aspx

Вы также можете найти свойство InstanceContextMode полезным для понимания и управления обработкой нескольких запросов от нескольких клиентов: http://msdn.microsoft.com/en-us/library/system.servicemodel.servicebehaviorattribute.instancecontextmode.aspx

2 голосов
/ 07 сентября 2010

Существуют настройки как для экземпляра, так и для параллелизма, подробности см. http://msdn.microsoft.com/en-us/library/ms731193.aspx.

Запуск службы WCF в IIS решает некоторые проблемы параллелизма.

1 голос
/ 07 сентября 2010

Вы можете контролировать параллелизм с помощью ConcurrencyMode и контролировать, как новые соединения обрабатываются с помощью InstanceContextMode - это документация Microsoft .

Количество одновременных соединений также может регулироваться - иметьвзгляните на элемент serviceThrottling в вашей конфигурации WCF.

0 голосов
/ 07 сентября 2010

Хорошо, служба выполняет запросы в отдельных потоках.

Так что они могут быть выполнены одновременно.

...