Балансировка нагрузки

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

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

Балансировка нагрузки с базовой привязкой HTTP

С точки зрения балансировки нагрузки приложения WCF, взаимодействующие с использованием BasicHttpBinding , не отличаются от других распространенных типов сетевого трафика HTTP (статического HTML-содержимого, ASP.NET страниц или веб-служб ASMX). Каналы WCF, использующие эту привязку, по сути, являются бессерверными и завершают свои подключения при закрытии канала. Поэтому привязка BasicHttpBinding хорошо работает с имеющимися методами балансировки нагрузки HTTP.

По умолчанию BasicHttpBinding отправляет заголовок HTTP подключения в сообщениях со значением Keep-Alive, которое позволяет клиентам устанавливать устойчивые подключения к службам, которые поддерживают их. Такая конфигурация увеличивает пропускную способность, потому что ранее установленные подключения можно повторно использовать для отправки новых сообщений одному и тому же серверу. Однако повторное использований подключений может привести к тому, что клиенты будут слишком сильно связаны с конкретным сервером фермы балансировки нагрузки, что приведет к снижению эффективности балансировки нагрузки за счет равномерного распределения запросов между серверами фермы. Если такое поведение является нежелательным, можно на сервере отключить заголовок Keep-Alive, присвоив свойству KeepAliveEnabled значение CustomBinding или пользовательскую привязку Binding. В следующем примере показано, как добиться этого с помощью конфигурации.

<?xml version="1.0" encoding="utf-8" ?>  
<configuration>  
  
 <system.serviceModel>  
  <services>  
   <service
     name="Microsoft.ServiceModel.Samples.CalculatorService"  
     behaviorConfiguration="CalculatorServiceBehavior">  
     <host>  
      <baseAddresses>  
       <add baseAddress="http://localhost:8000/servicemodelsamples/service"/>  
      </baseAddresses>  
     </host>  
    <!-- configure http endpoint, use base address provided by host  
         And the customBinding -->  
     <endpoint address=""  
           binding="customBinding"  
           bindingConfiguration="HttpBinding"
           contract="Microsoft.ServiceModel.Samples.ICalculator" />  
   </service>  
  </services>  
  
  <bindings>  
    <customBinding>  
  
    <!-- Configure a CustomBinding that disables keepAliveEnabled-->  
      <binding name="HttpBinding" keepAliveEnabled="False"/>  
  
    </customBinding>  
  </bindings>  
 </system.serviceModel>  
</configuration>  

Используя упрощенную конфигурацию, представленную в платформа .NET Framework 4, можно выполнить такое же поведение с помощью следующей упрощенной конфигурации.

<?xml version="1.0" encoding="utf-8" ?>  
<configuration>  
 <system.serviceModel>  
    <protocolMapping>  
      <add scheme="http" binding="customBinding" />  
    </protocolMapping>  
    <bindings>  
      <customBinding>  
  
      <!-- Configure a CustomBinding that disables keepAliveEnabled-->  
        <binding keepAliveEnabled="False"/>  
  
      </customBinding>  
    </bindings>  
 </system.serviceModel>  
</configuration>  

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

Балансировка нагрузки с привязкой WSHttp и привязкой WSDualHttp

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

  • Отключите создание контекста безопасности или используйте сеансы безопасности с отслеживанием состояния. Создание контекста безопасности можно отключить, задав EstablishSecurityContext для свойства значение WSHttpBindingfalse. Если требуется использование WSDualHttpBinding или сеансы безопасности, можно использовать сеансы безопасности с отслеживанием состояния, как описано в разделе "Безопасные сеансы". Сеансы безопасности с отслеживанием состояния позволяют службе оставаться без отслеживания состояния, так как все состояние сеанса безопасности передается с каждым запросом в рамках маркера безопасности защиты. Чтобы включить сеанс безопасности с отслеживанием состояния, необходимо использовать CustomBinding определенный пользователем или определенный пользователем Bindingпараметр, так как необходимые параметры конфигурации не предоставляются в системе WSHttpBinding и WSDualHttpBinding.

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

  • Не используйте надежные сеансы. Эта возможность отключена по умолчанию.

Балансировка нагрузки привязки Net.TCP

Балансировку нагрузки привязки NetTcpBinding можно осуществлять с помощью методов балансировки нагрузки уровня протокола IP. Однако для уменьшения времени задержки подключений привязка NetTcpBinding по умолчанию объединяет TCP-подключения. Такая оптимизация противоречит базовому механизму балансировки нагрузки. Основным параметром конфигурации, используемым для оптимизации NetTcpBinding, является время ожидания аренды, которое входит в настройки пула подключений. В результате объединения клиентских подключений в пул эти подключения оказываются связанными с конкретными серверами фермы. По мере увеличения времени существования таких подключений (этот показатель зависит от значения времени ожидания аренды) распределение нагрузки между различными серверами фермы становится несбалансированным. В результате среднее время одного вызова увеличивается. Поэтому при использовании привязки NetTcpBinding с балансировкой нагрузки следует рассмотреть возможность уменьшения используемого привязкой времени ожидания аренды по умолчанию. Для начала использования балансировки нагрузки можно установить время ожидания аренды равным 30 секундам, хотя оптимальное значение будет зависеть от конкретного приложения. Дополнительные сведения о времени ожидания аренды канала и других квотах транспорта см. в разделе "Квоты транспорта".

Для достижения максимальной производительности при балансировке нагрузки рекомендуется использовать NetTcpSecurity (Transport или TransportWithMessageCredential).

См. также