Как быстро сканировать XML (ы), учитывая следующие сетевые ограничения? - PullRequest
0 голосов
/ 22 января 2019

У меня есть .Net сканер, который работает, когда пользователь делает запрос (поэтому он должен быть быстрым). Он сканирует более 400 ссылок в режиме реального времени. (Это бизнес спросить.)

Проблема: мне нужно определить, является ли ссылка в формате xml (например, RSS или каналы Atom) или HTML. Если ссылка является XML, то я продолжаю обработку, но если ссылка HTML, я могу пропустить ее. Обычно у меня есть 2 xml (s) и 398+ html (s). В настоящее время у меня запущено несколько потоков, но обработка все еще медленная, обычно 75 секунд работает с 10 потоками для 400+ ссылок или 280 секунд работает с 1 потоком. (Я хочу добавить больше тем, но смотри ниже ..)

Проблема, с которой я сталкиваюсь, заключается в том, что я читаю потоки следующим образом:

var request = WebRequest.Create(requestUriString: uri.AbsoluteUri);
// ....
var response = await request.GetResponseAsync();
//....
using (var reader = new StreamReader(stream: response.GetResponseStream(), encoding: encoding)) {
                        char[] buffer = new char[1024];
                        await reader.ReadAsync(buffer: buffer, index: 0, count: 1024);
                        responseText = new string(value: buffer);
}
// parse first byts of reasponseText to check if xml 

Проблема в том, что моя оптимизация, чтобы получить только 1024, совершенно бесполезна, потому что, как я вижу, GetResponseAsync в любом случае загружает весь поток. (Другой вариант, который у меня есть, это искать заголовок ContentType, но это довольно похоже на AFAIK, потому что я все равно получаю контент - в случае, если вы не рекомендуете использовать ОПЦИИ, которые я до сих пор не использовал - и, кроме того, xml может быть неправильно помечен как тип контента (?), и я собираюсь пропустить некоторый контент.)

Если есть какая-то оптимизация, которую мне не хватает, пожалуйста, помогите, так как у меня заканчиваются идеи.

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

1 Ответ

0 голосов
/ 22 января 2019

Использование запросов HEAD может значительно ускорить запросы, ЕСЛИ вы можете положиться на Content-Type.

например,

HttpClient client = new HttpClient();
HttpResponseMessage response = await client.SendAsync(new HttpRequestMessage() { Method = HttpMethod.Head});

Просто показывает основное использование. Очевидно, что вам нужно добавить URI и все остальное, необходимое для запроса.

Также просто отметим, что даже при 10 потоках 400 запросов, вероятно, всегда будут занимать довольно много времени. 400/10 означает 40 запросов последовательно. Если запросы не поступают к серверам, находящимся близко к этому времени, 200 мс будет хорошим временем ответа, означающим минимум 8 секунд. Службы Ovserseas, которые могут быть медленными, могут легко вытолкнуть это до 30-40 секунд неизбежной задержки, если вы не увеличите количество потоков для параллельного выполнения большего количества запросов.

Поток данных (Task Parallel Library) Может быть очень полезен для написания параллельных каналов с удобным свойством MaxDegreeOfParallelism для простой настройки количества параллельных экземпляров, которые могут быть запущены.

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