Настройка службы WCF для нескольких вызовов клиентов - PullRequest
4 голосов
/ 23 мая 2010

Я создал службу WCF, которая определяется следующим образом:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]

привязка выполняется с помощью netTcpBinding.

Мы поддерживаем более 50 клиентов, которые время от времени обращаются к серверу. Каждый клиент открывает канал с использованием channelfactory после его загрузки и использует этот канал для всех вызовов (создает канал и прокси-сервер только один раз).

мы создали небольшой тестер нагрузки, который имитирует клиента, вызывая сервер сразу 50 различными потоками (используя 50 различных каналов). когда мы запускаем этот тестер, после того, как 10-й клиент пытается подключиться, все остальные клиенты не могут подключиться. Мы установили регулировку на 100.

Мои вопросы:

  1. Правильно ли для каждого клиента создавать канал и использовать его на протяжении всей жизни клиента? или мне нужно использовать оператор using для каждого вызова к серверу (создать и распределить новый канал для каждого вызова).
  2. Есть ли у сервиса ограничение количества подключений к нему? что-то другое душит?

Ответы [ 2 ]

4 голосов
/ 23 мая 2010

Количество одновременных подключений к серверу контролируется как режимом регулирования службы WCF, так и вашим компьютером (на самом деле это ОС). У машин с Windows XP было жесткое ограничение на 10 одновременных подключений - может ли это быть проблемой? Если вы работаете на сервере, это ограничение не должно применяться.

Режим регулирования службы также имеет значение по умолчанию для MaxConcurrentSessions, равное 10, и все ваши соединения netTcpBinding будут иметь сеанс транспортного уровня, так что это определенно также проблема.

Вы можете изменить настройки поведения регулирования службы в файле конфигурации вашего приложения:

 <serviceBehaviors>
    <behavior  name="TcpMoreThan10">
      <serviceThrottling 
        maxConcurrentCalls="100" 
        maxConcurrentSessions="50" 
        maxConcurrentInstances="50" />
    </behavior>
  </serviceBehaviors>

и вам необходимо добавить это поведение службы к вашему тегу <service>, чтобы включить его:

<service name="....." behaviorConfiguration="TcpMoreThan10">
     ....
</service>

Если у вас есть только до 50 клиентов, которые время от времени звонят, и все они являются «внутренними» клиентами, использующими netTcpBinding, я не вижу веской причины, почему вы хотели бы сделать эту вещь многопоточной синглтоном, на самом деле .

В качестве дополнительного примечания: многопоточные синглтоны, как известно, трудны для написания, сложны для того, чтобы все исправить, вам нужно беспокоиться о параллельном доступе к вашим внутренним переменным и т. Д. - довольно запутанное программирование.

Почему бы не использовать режим экземпляра для каждого вызова по умолчанию? С этим:

  • каждый поступающий запрос сообщает свой отдельный, отдельный, только что созданный экземпляр класса обслуживания
  • каждый экземпляр класса обслуживания обрабатывает только одного абонента, поэтому нет необходимости в запутанных и сложных многопоточных моделях программирования
0 голосов
/ 23 мая 2010

Вы проверили лимит CAL на вашем сервере?

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

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