ОТДЫХ, WCF и очереди - PullRequest
       17

ОТДЫХ, WCF и очереди

1 голос
/ 27 марта 2009

Я создал службу RESTful с использованием WCF, которая вычисляет некоторое значение и затем возвращает ответ клиенту.

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

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

И другая операция, выполняемая с полученными данными. Например, клиент может отправить инструкцию «дайте мне среднее значение за последние 200 измерений», поэтому для вычисления этого значения может потребоваться некоторое время, и в то же время тот же запрос может поступить от другого клиента.

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

Спасибо!

Ответы [ 4 ]

1 голос
/ 28 марта 2009

Если вы используете веб-службу, Протокол управления передачей (TCP / IP) будет действовать в определенной степени как очередь.

TCP обеспечивает надежный, заказанный доставка потока байтов от одного программировать с одного компьютера на другой программа на другом компьютере.

Это гарантирует, что если клиент отправит пакет A, B, затем C, сервер получит его в таком порядке: A, B, затем C. Если вы должны ответить клиенту в том же порядке, что и запрос, то вы может понадобиться очередь.

По умолчанию максимальный рабочий поток ASP.NET установлен на 12 потоков на ядро ​​ЦП. Таким образом, на двухъядерной машине вы можете запускать 24 соединения одновременно. В зависимости от того, сколько времени занимает расчет и что вы подразумеваете под «большим трафиком», вы можете попробовать разные стратегии.

Самое простое - это использовать serviceTimeouts и serviceThrottling, обрабатывать только то, что вы можете обработать, и отклонять то, что вы не можете.

Если это не вариант, увеличьте аппаратное обеспечение. Это второй вариант.

Наконец, вы можете сделать сервис полностью асинхронным. Реализуйте два метода
string PostCalc(...) и double GetCalc(string id). PostCalc принимает параметры, помещает их в очередь (или базу данных) и немедленно возвращает GUID (мне нравится использовать string вместо Guid). Клиент может использовать возвращенный GUID в качестве заявки на получение заявки и каждые несколько секунд вызывать GetCalc(string id). Если расчет еще не завершен, вы можете вернуть 404 для REST. Расчет теперь должен выполняться отдельным процессом, который отслеживает очередь.

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

1 голос
/ 05 мая 2009

Вы можете использовать MsmqBinding и использовать метод, реализованный eedsi9n. Однако из этого поста я понял, что вы ищете что-то похожее на архитектуру типа паб / подтип.

Это может быть реализовано с помощью WSDualHttpBinding, который позволяет подписчикам подписываться на события. Издатель уведомит пользователя о завершении действия.

Поэтому вы могли бы запустить Msmq за кулисами. Клиент подписывается на определенные события, затем, возможно, публикует сообщение, которое необходимо обработать. Клиент сидит там и работает (потому что все это асинхронно), и когда издатель завершает работу над этим сообщением, он может опубликовать событие (событие, на которое подписался ваш клиент), сообщающее вам, что оно выполнено. Таким образом, вам не нужно реализовывать стратегию опроса.

Для этого также есть готовые решения. Такие как NService Bus, Mass Transit и Rhino Bus.

0 голосов
/ 12 мая 2009

Здесь нет ничего особенного WCF, если вы RESTful GET для Average даст URI, где ответ будет ждать, когда сервер завершит вычисление (если это действительно длинная операция) Относительно получения измерений - вы не указали необходимую свежесть (то есть, когда вы получаете запрос на среднее значение - насколько свежими вам нужны результаты) Также вы не указали относительную частоту запросов относительно новых измерений. В любом случае вы можете (и IMHO должен) использовать очередь (при условии, что измерение вашей производительности доказывает это) за конечной точкой. Если вы измените привязку WCF, вы все равно можете быть RESTful, но не сможете воспользоваться стандартным подходом REST по HTTP

0 голосов
/ 27 марта 2009

Это будет зависеть от того, что вы подразумеваете под «вычисляет некоторое значение » и « много трафика ». Вы можете выполнить некоторое нагрузочное тестирование и посмотреть, как число запросов в секунду развивается вместе с трафиком.

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