Одновременная загрузка данных JSON из удаленных служб

Я извлекаю данные JSON с нескольких удаленных серверов одновременно через HTTP, используя службу WCF как на клиентских, так и на серверных конечных точках. Я заметил, что для каждого последовательного запроса, который запускается асинхронно, продолжительность HTTP-запроса обычно увеличивается, даже если объем данных не обязательно увеличивается. Другими словами, если я запускаю 12 потоков пула (используя Func <>. BeginInvoke), то каждый запрос, после того как он рассчитан, отображается в моих журналах как таковой:

  :HttpRequest invoked. Elapsed: 325ms
  :HttpRequest invoked. Elapsed: 27437ms
  :HttpRequest invoked. Elapsed: 28642ms
  :HttpRequest invoked. Elapsed: 28496ms
  :HttpRequest invoked. Elapsed: 32544ms
  :HttpRequest invoked. Elapsed: 38073ms
  :HttpRequest invoked. Elapsed: 41231ms
  :HttpRequest invoked. Elapsed: 47914ms
  :HttpRequest invoked. Elapsed: 45570ms
  :HttpRequest invoked. Elapsed: 61602ms
  :HttpRequest invoked. Elapsed: 53567ms
  :HttpRequest invoked. Elapsed: 79081ms

Процесс довольно прост. Я просто запускаю каждый запрос в цикле, а затем вызываю .WaitAll () для всех операций перед использованием консолидированных данных.

Похоже, что запросы Http выполняются намного дольше, чем следовало бы, даже с небольшими объемами данных. На самом деле разница между маленькими и большими объемами данных в целом минимальна. Будет ли это узкое место из-за одновременных HTTP-запросов, которые должны совместно использовать полосу пропускания, или здесь возможна проблема потоковой передачи / переключения контекста? Просто хочу, чтобы тебя указали в правильном направлении.

РЕДАКТИРОВАТЬ - Для ясности я запустил тот же процесс синхронно , и вот результаты:

  :HttpRequest invoked. Elapsed: 20627ms
  :HttpRequest invoked. Elapsed: 16288ms
  :HttpRequest invoked. Elapsed: 2273ms
  :HttpRequest invoked. Elapsed: 4578ms
  :HttpRequest invoked. Elapsed: 1920ms
  :HttpRequest invoked. Elapsed: 564ms
  :HttpRequest invoked. Elapsed: 1210ms
  :HttpRequest invoked. Elapsed: 274ms
  :HttpRequest invoked. Elapsed: 145ms
  :HttpRequest invoked. Elapsed: 21447ms
  :HttpRequest invoked. Elapsed: 27001ms
  :HttpRequest invoked. Elapsed: 1957ms

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

У меня есть более простой вопрос:

1) Если я использую не -threadpool thread, может ли это улучшить

2) Должен ли я сгруппировать операции только в несколько потоков, вместо того, чтобы каждый запрос имел свой собственный?

3) Это стандартная проблема при попытке одновременной загрузки данных по Http?

6
задан Sean Thoman 29 July 2011 в 23:35
поделиться