Балансировка нагрузки
Один из способов повышения производительности приложений 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="https://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 привязки WSHttpBinding значение false. Если же требуется использовать сеансы безопасности, можно установить сеансы безопасности с отслеживанием состояния, как описано в разделе Безопасные сеансы. Сеансы безопасности с отслеживанием состояния позволяют службе не отслеживать состояние, потому что все сведения о состоянии сеанса безопасности передаются с каждым запросом в рамках маркера безопасности защиты. Обратите внимание, что для включения сеансов безопасности с отслеживанием состояния необходимо использовать привязку CustomBinding или определенную пользователем привязку Binding, поскольку необходимые параметры конфигурации не доступны в привязках WSHttpBinding и WSDualHttpBinding, которые предоставляются системой.
Не используйте надежные сеансы. Эта функция отключена по умолчанию.
Балансировка нагрузки привязки Net.TCP
Балансировку нагрузки привязки NetTcpBinding можно осуществлять с помощью методов балансировки нагрузки уровня протокола IP. Однако для уменьшения времени задержки подключений привязка NetTcpBinding по умолчанию объединяет TCP-подключения. Такая оптимизация противоречит базовому механизму балансировки нагрузки. Основным параметром конфигурации, используемым для оптимизации NetTcpBinding, является время ожидания аренды, которое входит в настройки пула подключений. В результате объединения клиентских подключений в пул эти подключения оказываются связанными с конкретными серверами фермы. По мере увеличения времени существования таких подключений (этот показатель зависит от значения времени ожидания аренды) распределение нагрузки между различными серверами фермы становится несбалансированным. В результате среднее время одного вызова увеличивается. Поэтому при использовании привязки NetTcpBinding с балансировкой нагрузки следует рассмотреть возможность уменьшения используемого привязкой времени ожидания аренды по умолчанию. Для начала использования балансировки нагрузки можно установить время ожидания аренды равным 30 секундам, хотя оптимальное значение будет зависеть от конкретного приложения. Дополнительные сведения о времени ожидания аренды канала и других квотах транспорта см. в разделе Квоты транспорта.
Для достижения максимальной производительности при балансировке нагрузки рекомендуется использовать NetTcpSecurity (Transport или TransportWithMessageCredential).