Рекомендации по надежным сеансам

В этом разделе рассматриваются рекомендации по надежным сеансам.

Настройка MaxTransferWindowSize

Надежные сеансы в Windows Communication Foundation (WCF) используют окно передачи для хранения сообщений в клиенте и службе. Настраиваемое свойство MaxTransferWindowSize указывает, сколько сообщений может храниться в окне передачи.

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

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

Размер окна передачи по умолчанию составляет восемь сообщений.

Эффективное использование сети

В этом контексте термин сеть подразумевает все, что используется в качестве основы связи между клиентом (отправителем) и службой (получателем). Это включает в себя транспортные подключения и любые посредники или мосты между, включая маршрутизаторы SOAP или прокси-серверы HTTP или брандмауэры.

Эффективное использование сети гарантирует, что емкость сети полностью используется. Объем данных, которые могут передаваться в секунду через сеть (скорость данных) и время, необходимое для передачи данных от отправителя получателю (задержка) влияет на то, как эффективно используется сеть.

У отправителя свойство MaxTransferWindowSize указывает, сколько сообщений может находиться в его окне передачи во время ожидания подтверждений. Если задержка в сети высока, для обеспечения оперативности отправителя и эффективного использования сети следует увеличить размер окна передачи.

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

Эксплуатация службы на полную мощность

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

Использование буфера повышает доступность службы по мере одновременного получения и буферизации сообщения при обработке ранее полученных сообщений.

Мы рекомендуем использовать то же самое MaxTransferWindowSize для отправителя и получателя.

Включение управления потоком

Управление потоками — это механизм, который гарантирует, что отправитель и получатель идут в ногу друг с другом, то есть сообщения потребляются и обрабатываются так быстро, как они создаются. Размер окна передачи на клиенте и службе гарантирует, что отправитель и получатель находятся в разумном окне синхронизации.

Мы настоятельно рекомендуем устанавливать свойство FlowControlEnabled в true, когда используется надежный сеанс между клиентом WCF и службой WCF.

Настройка MaxPendingChannels

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

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

Служба может находиться в состоянии, когда она не может принимать больше каналов. Если очередь заполнена, попытка установить надежный сеанс отклоняется, и клиент должен повторить попытку.

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

При написании службы, которая одновременно обслуживает несколько клиентов, необходимо задать значение, подходящее для ваших потребностей. Установка слишком высокого значения свойства MaxPendingChannels затрагивает рабочий набор.

Значение по умолчанию для MaxPendingChannels равно четырем каналам.

Надежные сеансы и размещение

При размещении веб-службы, используюющей надежные сеансы, следует учитывать следующие важные аспекты:

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

  • Надежные сеансы с использованием двух каналов HTTP (например, использование WsDualHttpBinding) могут требовать больше, чем по умолчанию двух HTTP-подключений на клиент. Это означает, что дуплексный надежный сеанс может потребовать до двух подключений в каждом направлении, поскольку одновременные сообщения приложений и протоколов могут передаваться в любой момент времени. При определённых условиях, зависящих от шаблона обмена сообщениями службы, это может означать, что веб-служба может попасть в состояние взаимной блокировки при использовании двойного HTTP и надёжных сеансов. Чтобы увеличить число допустимых HTTP-подключений на клиент, добавьте следующее в соответствующий файл конфигурации (например, web.config этой службы):

    <configuration>
      <system.net>
        <connectionManagement>
          <add name="*" maxconnection="4" />
        </connectionManagement>
      </system.net>
    </configuration>
    

    Значение атрибута maxconnection — это количество необходимых подключений. Минимальное значение в этом случае должно быть четыре подключения.