2

Dans les versions précédentes de HttpClient, l'hôte cible était configuré dans le client lui-même. Dans la dernière version (pour HttpAsyncClient c'est 4.1.1) l'hôte est mis en place dans HttpRequest (HttpGet, HttpPost etc.) chaque fois que je fais une demande.Comment fonctionne HttpAsyncClient 4?

Je souhaite utiliser une connexion persistante, donc j'utilise HttpAsyncClient. Créer et utiliser comme ceci:

CloseableHttpAsyncClient client = HttpAsyncClients.createDefault(); 
client.start(); 
List<Future<HttpResponse>> responses = new ArrayList<>(); 
for (int i = 0; i < 10; i++) 
{ 
    HttpGet get = new HttpGet("https://google.com/"); 
    responses.add(client.execute(get, null)); 
} 
for (Future<HttpResponse> response : responses) { 
    response.get(); //wait for the response 
} 

Comme je l'ai testé, il fonctionne plus vite que d'habitude HttpClient (si je fais toutes les demandes, puis attendre toutes les réponses).

Mais je ne peux pas entièrement comprendre, comment cela fonctionne à l'intérieur. Combien de connexions avec https://google.com/ sont établies? Que se passe-t-il si j'utilise client pour un hôte, puis pour un autre? (comme je l'ai testé, les réponses peuvent venir dans n'importe quel ordre, donc je suppose qu'il y a au moins 2 connexions en parallèle). Quelle est la différence entre HttpAsyncClients.createDefault() et HttpAsyncClients.createPipelining()?

Merci!

+0

Votre question est un peu compliqué, à savoir, trop abstraite et appartient peut-être dans un autre forum. Je n'ai pas cherché de spécifications, mais je suppose que HttpAsyncClient crée un Thread parce que la classe Future fait partie du package de simultanéité. Par conséquent, votre programme crée dix threads d'arrière-plan qui s'exécutent indépendamment sur les différents cœurs de votre ordinateur. Mon portable très basique a quatre cœurs, donc j'obtiens quatre fois l'amélioration des performances lorsque je cours plusieurs threads. Si vous utilisez le HttpClient habituel, vous faites 10 requêtes séquentielles, attendant que chacune d'elles se termine avant que la suivante ne commence. –

+0

Future peut être utilisé dans HttpAsyncClient à cause du travail asynchrone avec HTTP (la méthode javadoc at execute() le confirme). Donc non, il ne s'agit pas seulement de threads (même si je suis d'accord - il y a sûrement des threads (daemons) créés dans HttpAsyncClient). – coolguy

+0

HttpAsyncClient utilise un petit nombre de threads de répartition d'e/s (égal au nombre de cœurs de processeur par défaut) pour effectuer la gestion et le traitement des messages. – oleg

Répondre

2

Par défaut, HttpAsyncClient autorise uniquement deux connexions simultanées au même hôte par spécification RFC 2616. Cette limite n'a rien à voir avec le nombre de threads d'envoi d'e/s utilisés en interne par le réacteur d'E/S.

Le code ci-dessus va créer au plus deux connexions sortantes.

Le traitement en pipeline de messages HTTP n'a rien à voir avec la persistance de connexion en soi, bien que l'exécution de requêtes en pipeline implique l'utilisation de connexions persistantes.

Le pipelinage HTTP concerne le séquençage des messages. HttpAsyncClient en mode Pipeline peut envoyer plusieurs demandes sans attendre chaque réponse.

Mode par défaut:

C -> request1 -> S 
C <- response1 <- S 
C -> request2 -> S 
C <- response2 <- S 

mode Pipelining:

C -> request1 -> S 
C -> request2 -> S 
C <- response1 <- S 
C <- response2 <- S 
+0

C'est assez clair maintenant, merci. Peut-être que vous seriez en mesure de répondre à mon autre question sur HttpAsyncClient? https://stackoverflow.com/questions/34576416 Y a-t-il une différence dans les requêtes HTTP créées par défaut ou dans le pipeline HttpAsyncClient? C'est vraiment important pour moi, je vais même commencer une prime demain. – coolguy

+0

N'utilisez pas le traitement en pipeline à moins d'en avoir un besoin spécifique, comme une connexion mobile avec une latence massive. – oleg

+0

J'ai une bonne raison de l'utiliser - Je ne me soucie pas vraiment des réponses et j'ai besoin d'augmenter les performances réseau (Je veux dire que je dois envoyer des demandes plus rapidement). – coolguy