WCF Оптимальные настройки производительности - PullRequest
3 голосов
/ 22 января 2011

Привет, я создаю API, используя WCF. Мой вопрос можно разбить на два отдельных

1) У меня довольно много звонков, например, у меня есть звонки, касающиеся клиентов, продуктов, заказов, сотрудников.

Мой вопрос: все ли это должно входить в один класс открытого интерфейса, например,

public interface IRestService
public class RestService : IRestService

Или я должен иметь один для каждого звонка, например,

public interface ICustomer
public class Customer : ICustomer

public interface IProducts
public class Products: IProducts

2) Если у вас есть API, к которому одновременно будут обращаться десятки тысяч пользователей и тысячи пользователей, как бы вы настроили, какими будут ваши настройки веб-конфигурации, например, в плане регулирования. Также, какую настройку вы бы дали своим InstanceContextMode или ConcurrencyMode. Наконец, какой тип привязки это будет, учитывая, что веб-сайты и мобильные телефоны могут получить доступ к API.

Ответы [ 2 ]

1 голос
/ 22 января 2011

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

public class RestService : ICustomer, IProducts, IOrders

Тем не менее, звучит так, как будто вы все равно захотите сделать их отдельными реализациями.

Что касается параметров параллелизма, спросите себя, какие ресурсы необходимо использовать для каждого вызова. Если конструктор вашего класса обслуживания может быть написан без какого-либо длительного запуска, используйте PerCall. Если вам нужно инициализировать дорогие ресурсы, я бы порекомендовал InstanceContextMode.Single с ConcurrencytMode.Multiple и обязательно написал бы потокобезопасный код. Например: убедитесь, что вы заблокировали () любые свойства класса или другие общие ресурсы, прежде чем использовать их.

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

Ваши настройки регулирования будут показаны при тестировании, как упоминает Ладислав. Вы хотели бы провести стресс-тестирование своего сервиса и использовать результаты, чтобы получить представление о том, сколько машин потребуется для обслуживания ожидаемой нагрузки. Затем вам понадобится специальный балансировщик нагрузки для маршрутизации запросов в виде циклического перебора или проверки состояния каждого сервера. Балансировщики нагрузки можно настроить, чтобы ПОЛУЧИТЬ страницу «systemhealth.asp» и проверить результаты. Если вы вернете «ОК», то этот компьютер останется в пуле или может быть временно удален из пула, если он отключился или вернул какой-либо другой статус.

Ваша привязка должна быть WebHTTPBinding для REST. BasicHTTPBinding предназначен для интерфейсов SOAP и не поддерживает, например, [WebGet].

Если это не обязательно должен быть сервис REST, то вы можете получить немного больше производительности, используя NetTcpBinding.

1 голос
/ 22 января 2011
  1. Если у вас действительно мало операций, можно использовать одну услугу.Обычно сервисы представляют собой логический набор связанных операций, но количество операций должно быть ограничено.Обычно, если в вашем сервисе более 20 операций, вам следует подумать о рефакторинге.

  2. Планируете ли вы использовать сервис REST?Я думаю, что вы делаете из-за вашего первого примера интерфейса.В таком случае вам понадобятся WebHttpBinding (или аналогичная пользовательская привязка) со значениями по умолчанию InstanceContextMode (PerCall) и ConcurrencyMode (Single).Только другая значимая комбинация для службы REST - это InstanceContextMode.Single и ConcurrencyMode.Multiple, но она создаст ваш сервис как одиночный, что может повлиять на реализацию вашего сервиса.Мое эмпирическое правило: Не используйте одноэтапный сервис, если он вам действительно не нужен.

  3. Настройка регулирования зависит от реализации вашего сервиса и производительности ваших серверов.Что для вас действительно значат тысячи одновременно работающих пользователей?Для одновременной обработки тысяч запросов требуется хороший кластер серверов с балансировщиком нагрузки или хостинг в Azure (облачный).Все также зависит от скорости обработки (выполнения операции) и размера сообщений.Правильные настройки для MaxConcurrentInstances и MaxConcurrentCalls (должны быть одинаковыми для PerCall экземпляров) должны быть выявлены при тестировании производительности. Значения по умолчанию для регулирования обслуживания изменены в WCF 4.

...