Как работает Concurrency в WCF?

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

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

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

Ответы

Ответ 1

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

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

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

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

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

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

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

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

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

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

  • PerCall instancing + Single concurrency - типичный сценарий без состояния. Разрешено несколько одновременных вызовов.

  • PerCall instancing + Multiple concurrency - не имеет смысла. Он по-прежнему ведет себя как Single concurrency.

  • PerSession instancing + Single concurrency - допускаются множественные одновременные вызовы, но только один вызов от каждого прокси-сервера может обрабатываться одновременно. Другие вызовы поставлены в очередь.

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

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

  • Single instancing + Multiple concurrency - разрешено несколько одновременных вызовов. Все вызовы получают доступ к одному экземпляру одновременно. Вы должны выполнить ручную синхронизацию доступа к общим полям в экземпляре службы.

Ответ 2

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

Если не задано, по умолчанию для параметра 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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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