WCF NetTcpBinding + один экземпляр + один параллелизм = блокировка / удаление вызовов? - PullRequest
0 голосов
/ 03 февраля 2011

У меня есть простая служба WCF, размещенная в службе Windows.Сам сервис ничего не делает, кроме имитации длинной транзакции, которая занимает 10 секунд.У меня также есть код в сервисе для регистрации записей в моей базе данных, поэтому я знаю, что он вызывается, операция завершена и т. Д.Вот сводка конфигураций служб:

  1. Binding: NetTcpBinding
  2. SessionMode: разрешен (не имеет значения)
  3. IsOneWay: true
  4. InstanceContextMode: single
  5. ConcurrencyMode: single

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

Однако я вижу только первый вызов, который регистрируетсяа остальные отброшены.Если я вставлю промежуток в 15 секунд между каждым вызовом, то каждый будет обслужен и зарегистрирован.Я возился со всеми видами настроек (inactivityTimeout, listenBackLog и т. Д.), Но ничего не помогло.

Что мне здесь не хватает?

1 Ответ

0 голосов
/ 04 февраля 2011
  • InstanceContextMode: single создает синглтон - только один экземпляр вашего класса обслуживания сможет обслуживать запросы.

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

Используя эти две настройки, вы создали себе узкое место ... да, запросы будут обрабатываться последовательно, один за другим. Поэтому очевидно, что в какой-то момент второй и последующий запрос должны встретиться с чем-то вроде тайм-аута или чего-то подобного и быть отброшенными. Эти тайм-ауты обычно устанавливаются на 1 минуту, поэтому 10-секундная транзакция не должна вызывать каких-либо проблем ....

Это действительно зависит от того, как вы делаете эти звонки, и, поскольку вы вообще не указали код, я могу только догадываться. Вы используете один клиентский прокси WCF? Или у вас действительно есть четыре отдельных экземпляра приложения, каждый из которых отправляет запрос?

Получаете ли вы какие-либо ошибки или неисправности на стороне клиента, куда вы отправляете запросы? Если так: что за ошибки? Ваш клиентский код вызывает начало сеанса?

Просто из любопытства: это только мысленный эксперимент или есть какая-то конкретная причина, по которой вы хотите произвольно создать такое узкое место в вашей системе? Я рекомендую использовать InstanceContextMode = PerCall, и это решит все эти проблемы, я уверен: все четыре запроса получат собственную копию класса обслуживания, и они должны обрабатываться одновременно, просто отлично.

...