Асинхронная обработка на стороне сервера WCF - PullRequest
5 голосов
/ 19 ноября 2011

Мне нужно создать службу WCF, которая принимает запрос клиента и внутренне подключается к удаленной машине для выполнения этой работы. Удаленная машина имеет очень хорошую производительность, но не высокую скорость обработки. Это означает, что он может обрабатывать, например, 1000 транзакций в секунду, но каждая транзакция может занимать 1 секунду, поэтому единственный способ - запустить 1000 одновременных транзакций в одну секунду.

Удаленная машина очень хорошо справляется с этой ситуацией, но меня беспокоит WCF, если каждая транзакция внутренне (меня не волнует модель на стороне клиента (синхронизация или асинхронизация)) ожидает и блокирует поток внутри сервера на 1 или 2 в секундах это может означать 1000 рабочих потоков, работающих в реальном времени, и это может быть очень опасно, или, возможно, WCF использует пул потоков и просто переводит запрос других в состояние ожидания, и это тоже плохо.

Итак, мой вопрос о возможности асинхронной обработки запроса на стороне сервера. Таким образом, поток транзакций должен быть таким:

  1. Клиент инициализирует запрос (на его стороне синхронный запрос)
  2. Сервер получает запрос и помещает его в очередь транзакций и освобождает поток
  3. Когда задача завершается, сервер завершает запрос, отправляя HTTP 200 и результат клиенту.

Спасибо!

Ответы [ 2 ]

1 голос
/ 21 ноября 2011

Вы можете использовать асинхронный шаблон WCF для достижения этой цели.Когда вы помечаете ваш operationContract атрибутом async, WCF использует потоки IO CompletionPort для обработки запроса.

, поэтому он работает следующим образом.Ваш запрос обрабатывается потоком в IIS, и как только он достигает WCF, он переходит в спящий режим, а затем поток IO CompletionPort принимает запрос, обрабатывает его, а затем отправляет ответ в поток IIS, который возвращает ответ клиенту.

Потоки ввода-вывода CompletionPort намного быстрее, а также не замедляют работу сервера с точки зрения производительности или ресурсов.

Посмотрите на следующую ссылку длябольше информации.

0 голосов
/ 04 декабря 2011

На сервере среднего уровня объявите и реализуйте свою операцию в соответствии с шаблоном асинхронности:

[OperationContract(Action = "DoSomething", AsyncPattern = true)]
IAsyncResult BeginDoSomething(AsyncCallback asyncCallback, object asyncState);
void EndDoSomething(IAsyncResult iar);

Реализация BeginDoSomething должна отправить запрос на удаленный компьютер и немедленно вернуться.Когда вы вызываете DoSomething () на стороне клиента, WCF на среднем уровне поймет, что эта операция реализована как асинхронная пара Begin / End, и вызовет ее соответствующим образом.

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