Сервис WCF для многих параллельных клиентов и доступа к базе данных

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

У меня есть многие клиенты (~200 - ~500), которые все выполняют запросы моего сервиса справедливо постоянно в течение рабочего дня. Большинство запросов включает опрос базовой базы данных для питания корректного ответа назад.

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

Было бы лучше ограничить количество параллельных соединений к сервису WCF и следовательно непреднамеренно сократить возможное количество соединений с базой данных?

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

Большое спасибо за любой совет.

11
задан Andy 22 January 2010 в 11:13
поделиться

3 ответа

Как уже упоминалось 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 для еще более подробно.

13
ответ дан 3 December 2019 в 05:58
поделиться
​​

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

Пожалуйста, прочитайте эту статью для получения дополнительной информации: объединение соединения ADO.NET с первым взглядом

4
ответ дан 3 December 2019 в 05:58
поделиться

У нас есть аналогичный сценарий, и мы решаем его, используя только один вывод из нашего WebService в БД и с использованием MARS от SQLSERVER, который работает отлично и довольно быстро. SQL Server действительно знает, как обрабатывать параллельные запросы, которые вы не должны думать в этом.

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

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

  [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
        ConcurrencyMode = ConcurrencyMode.Multiple)]

и на конфиге:

<serviceThrottling maxConcurrentCalls="100"
 maxConcurrentSessions="100" 
 maxConcurrentInstances="100" />

Эта опция внутри

  <behaviors>
      <serviceBehaviors>
        <behavior name="...">

Надеюсь, это поможет :)

3
ответ дан 3 December 2019 в 05:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: