Я плохо знаком с сервисами WCF и задался вопросом, какой лучший способ заняться следующим будет.
У меня есть многие клиенты (~200 - ~500), которые все выполняют запросы моего сервиса справедливо постоянно в течение рабочего дня. Большинство запросов включает опрос базовой базы данных для питания корректного ответа назад.
То, в чем я обеспокоен, является потенциальным количеством соединений с базой данных, порожденных от входящих запросов. Если все клиенты выполнят одновременные запросы тогда, то сервер базы данных сильно ударят. Я хотел бы избежать глупого количества соединений с базой данных, если это возможно.
Было бы лучше ограничить количество параллельных соединений к сервису WCF и следовательно непреднамеренно сократить возможное количество соединений с базой данных?
Я посмотрел на создание сервиса одиночный элемент, который порождает потоки, чтобы сделать транзакцию базы данных, таким образом, я могу управлять количеством потоков, но являюсь этим излишеством и был бы, ограничивая соединения с сервисом, достаточны?
Большое спасибо за любой совет.
Как уже упоминалось Marcos - WCF имеет встроенную услугу дроссельной способности, которую вы можете настроить на сервере. Это предотвращает, чтобы ваш сервер базы данных будет затоплен слишком много запросов одновременно.
По умолчанию относятся:
<serviceThrottling
maxConcurrentCalls="16"
maxConcurrentSessions="10"
maxConcurrentInstances="26" />
см. Документы MSDN MSDN на Servicthrottlingbehavior для более подробной информации.
Это означает, что максимум 16 вызовов обрабатывается одновременно WCF - то есть , если Ваш класс обслуживания WCF позволяет одновременно использовать несколько абонентов!
Вопреки Marcos, я бы рекомендую сделать свой класс WCF Service Singleton. Общая лучшая практика состоит в том, чтобы иметь простой класс услуг WCF и использовать его в зависимости от моды вызова - E.g. Каждый входящий запрос получит свой собственный, совершенно отдельный, вновь созданный экземпляр вашего класса службы WCF - до максимума, как определено поведением службы поведения и управлению выполнением WCF.
Если вы делаете свой класс WCF Service класс Singleton, вы должны либо установить его ConsurrencyMode для нескольких - но тогда вам необходимо использовать особую осторожность, чтобы не позволить двум одновременным потокам в вашем классе изменить одни и те же значения из-под друг друга; Многопоточное безопасное программирование является серьезной проблемой! Или вы не устанавливаете режим параллелизма нескольким, но затем ваш и единственный экземпляр класса обслуживания WCF может обрабатывать только запросы в последовательной моде, по одному за раз - не очень масштабируемый!
За вызовом и один экземпляр обслуживания на запрос определенно является гораздо более простым способом. Это с обслуживанием дросселирования на месте, а с объединением соединения ADO.Net создает очень мощное и хорошо поведенскую среду!
Также см. Отличный блог Dan Rigsby Post в службе поддержки WCF для еще более подробно.
Если вы используете ADO для подключения к вашей базе данных, он должен предоставить механизм объединения соединений, поэтому вам не нужно иметь дело с этим.
Пожалуйста, прочитайте эту статью для получения дополнительной информации: объединение соединения ADO.NET с первым взглядом
У нас есть аналогичный сценарий, и мы решаем его, используя только один вывод из нашего WebService в БД и с использованием MARS от SQLSERVER, который работает отлично и довольно быстро. SQL Server действительно знает, как обрабатывать параллельные запросы, которые вы не должны думать в этом.
Вы избегаете с тем, что накладные расходы открываются и закрывают соединения (обвиснология, что объединение соединения помогает в этом случае)
запомнить также, чтобы добавить в свой веб-сервис что-то вроде:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
ConcurrencyMode = ConcurrencyMode.Multiple)]
и на конфиге:
<serviceThrottling maxConcurrentCalls="100"
maxConcurrentSessions="100"
maxConcurrentInstances="100" />
Эта опция внутри
<behaviors>
<serviceBehaviors>
<behavior name="...">
Надеюсь, это поможет :)