2015-12-02 2 views
1

Работа с веб-службой без остатка WCF и работа с тремя независимыми задачами. Каждый из них может работать независимо. Каждая задача состоит из вызова веб-службы внешнему API & последующей локальной операции чтения БД, которая занимает менее 0,25 с.WCF Многопоточность с учетом масштабируемости

Первое, что приходит в голову, это то, что я должен создать 3 отдельных потока, а затем присоединиться и вернуть результат. Использование пула потоков, вероятно, не будет хорошей идеей здесь, так как его ограничение ограничено 250 шагами.

Производительность вызывает озабоченность, но не за счет масштабируемости.

Должен ли я беспокоиться о накладных расходах при запуске &, соединяющих 3 отдельных потока для каждого вызова веб-службы?

ответ

0

Оберните вызовы внешней службе в async Методы задач, а затем вызовите из вашего метода WCF. Он будет использовать пул потоков и будет очень удобно загружать ваши веб-сервисы, если поток потока исчерпан.

+0

Но это противоречит требованию масштабируемости. Пулы потоков ограничены до 250 потоков макс. – AlexVPerl

+0

Размер пула потоков обычно равен числу логических потоков, умноженному на 25. Чтобы масштабировать вашу службу, вам нужно будет увеличивать количество доступных логических потоков для вашей службы. –

+0

Я не думаю, что ThreadPool подходит для сценария в моем вопросе из-за ограничения количества потоков. Я бы даже не подумал об использовании ThreadPool для этого. Используя потоки напрямую, не существует мягкого ограничения, только то, что ваше оборудование может поддерживать. – AlexVPerl

0

Вы можете использовать async IO для выполнения вызовов webservice. Async IO вообще не занимает ни одного потока во время его работы. Вы можете сделать то же самое для вызовов базы данных. Это облегчает любые проблемы с потоками, которые могут возникнуть у вас.

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

В случае, если внешняя служба выключена и занимает 30 секунд, чтобы отключить этот номер, теперь он снимает до 3000 потоков, которые я считаю небезопасными. Таким образом, вам нужен либо небольшой тайм-аут, либо автоматический выключатель, либо асинхронный ввод-вывод.

Поэтому, чтобы решить, вам нужно спрогнозировать нагрузку и задержку.

я ссылка на какую-то дискуссию, почему и когда использовать асинхронную IO:

https://stackoverflow.com/a/25087273/122718 Почему EF 6 обучающие использовать asychronous звонки? https://stackoverflow.com/a/12796711/122718 Должны ли мы переключиться на использование async I/O по умолчанию?