Правильный способ обработки тысяч звонков на внешний сервис от asp.net (mvc) - PullRequest
3 голосов
/ 02 февраля 2010

Мне поручено создать веб-приложение. В настоящее время я использую c # & asp.net (mvc - но я сомневаюсь, что это актуально для вопроса) - я начинающий разработчик и несколько новичок в .net.

Часть логики в приложении, которое я создаю, состоит в том, чтобы делать запросы к внешнему smsgateway посредством нажатия на определенный URL-адрес с помощью запроса - либо как часть инициируемого пользователем действия в веб-приложении (может быть пара сообщений отправить) или как часть запланированной задачи, выполняемой ежедневно (может быть и будет отправлено несколько тысяч сообщений).

По отношению к ежедневным задачам, я боюсь, что цикл - скажем, - 10.000 раз в одном потоке (особенно, если я также должен предпринять действия в зависимости от ответа на запрос - как, например, запись в БД) - не лучшая стратегия и что я мог бы получить некоторую экономию производительности / времени от некоторого распараллеливания.

В конечном итоге я больше боюсь, что тысячи пользователей одновременно (весьма вероятно) выполнят действие, которое вызовет запрос. С наивной реализацией, которая порождает какой-то фоновый поток (независимо от того, как он вызывается) для каждого запроса, я боюсь сценария с сотнями / тысячами запросов одновременно.

Так что, если мои предположения верны - как мне справиться с этим? мне нужно вручную порождать какое-то соответствующее количество новых Thread () и координировать их работу из очереди типа «продюсер / потребитель» или есть какой-то простой способ?

Приветствия

Ответы [ 4 ]

3 голосов
/ 02 февраля 2010

Если вам нужно сделать 10 000 запросов к службе, это означает, что API службы анемичен - возможно, основан на CRUD, разработан как тонкая оболочка над базой данных вместо реальной службы.

Один «запрос» к хорошо спроектированной службе должен передавать всю информацию, необходимую для выполнения одной «единицы работы» - иными словами, эти 10 000 запросов могут быть с большой вероятностью объединены в один запрос или, по крайней мере, маленькая горстка запросов. Это особенно важно, если запросы отправляются на удаленный сервер или могут занимать много времени (а 2-3 секунды - это чрезвычайно длительное время в вычислениях).

Если у вас нет контроля над службой, если у вас нет возможности изменить спецификацию или API - тогда, я думаю, вам будет очень сложно. Одна машина просто не может обрабатывать 10 000 исходящих соединений одновременно; это будет бороться даже с несколькими сотнями. Вы можете попытаться распараллелить это, но даже если вы достигнете десятикратного увеличения пропускной способности, это все равно займет полчаса, что является той задачей, которую вы, вероятно, не хотите запускать на общедоступном веб-сайте ( но тогда, может быть, вы знаете, я не знаю специфику).

Возможно, вы могли бы более конкретно рассказать об окружающей среде, архитектуре и о том, что вы пытаетесь сделать?


В ответ на ваше обновление (возможно, тысячи пользователей одновременно выполняют действие, требующее отправки одного или двух SMS-сообщений для каждого):

Это похоже на сценарий, в котором вы должны использовать Message Queuing . На самом деле не так уж сложно настроить решение с использованием WCF . Вот некоторые из основных причин использования очереди сообщений:

  • отправлено большое количество сообщений;
  • Отправляющее приложение не может позволить себе отправлять их синхронно или ждать какого-либо ответа;
  • Сообщения должны в конечном итоге быть доставлены.

И ваши требования соответствуют этому как перчатка. Поскольку вы уже в стеке Microsoft, я определенно рекомендую асинхронную службу WCF, поддерживаемую MSMQ.

0 голосов
/ 02 февраля 2010

Я бы также рассмотрел использование AsyncController , чтобы ваш сайт не стал полностью непригодным для использования.

0 голосов
/ 02 февраля 2010

SOAP-запрос к веб-службе (при условии .NET 2.0 и выше) выглядит примерно так:

WebServiceProxyClient myclient = new WebServiceProxyClient();

myclient.SomeOperation(parameter1, parameter2);

myclient.Close();

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

Вам не нужно делать ничего особенного в вашем коде , чтобы справиться с большим количеством пользователей. На самом деле это будет причиной взлома вашей платформы.

Когда вы говорите 10.000 запрос, что вы имеете в виду? 10.000 запросов в секунду / минуту / час, это ваш просмотр страницы в день и т. Д.

0 голосов
/ 02 февраля 2010

Если вы работаете с SOAP или XML-запросом другого типа, у вас может не возникнуть проблем с уровнем запросов в цикле.

Я настроил нечто подобное, используя SOAP-сервер с 4-5K-запросами без проблем ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...