Camel Framework: comparaison des composants HTTP et AHC

Cet article compare le travail des services les plus simples implĂ©mentĂ©s Ă  l'aide du framework Camel et de ses deux composants: HTTP et AHC. Nous ne nous plongerons pas dans la structure et ne travaillerons pas avec le cadre lui-mĂȘme, on suppose que le lecteur est dĂ©jĂ  un peu familier avec elle.





Nous considĂ©rerons un service Camel simple qui reçoit les requĂȘtes du composant jetty, les traite, par exemple, les affiche dans le journal, appelle un autre service via http et traite la rĂ©ponse de celui-ci, par exemple, Ă©crit dans le journal.





Pour les tests, des scripts JMeter ont été utilisés pour appeler notre service conformément à la fréquence et aux intervalles prévus, ainsi qu'un petit service Http qui joue le rÎle d'externe à notre service et effectue un retard de 5 secondes. Toutes les communications s'effectuent sur une boucle locale (127.0.0.1), les latences du réseau ne sont donc pas prises en compte, mais elles ne sont pas nécessaires pour une analyse comparative.





Composant HTTP

Cette section examinera le composant HTTP standard pour la communication HTTP. Code de service simple:





from("jetty:http://localhost:8080/test")
     .log("receive request body ${body}")
     .removeHeaders("CamelHttp*")
     .to("http://{{another.url}}")
     .log("finish process body ${body}");
      
      



Remarque: la suppression des en-tĂȘtes commençant par "CamelHttp" est nĂ©cessaire car ils sont exposĂ©s dans le composant Jetty et peuvent affecter le fonctionnement du composant Http.





Pour tester le fonctionnement de ce service, exĂ©cutons le script JMeter qui envoie 25 requĂȘtes simultanĂ©es.





Échantillons





Min





Max





Erreur%





25





5012





7013





20 000%





, 20% 5 25 (Read timed out). , http- 20 . connectionsPerRoute





from("jetty:http://localhost:8080/test")
     .log("receive request body ${body}")
     .removeHeaders("CamelHttp*")
     .to("http://{{another.url}}?connectionsPerRoute=200")
     .log("finish process body ${body}");
      
      



25 . – jetty-, 200. 4 JMeter:





  1. 200





  2. 300





  3. 300 5 , 5





  4. 200 5 , 5





1 JVM 214 , .





:





 









200





0%





300





34.667%





300 5





71.733%





200 5





0%









300 , 200 jetty-, 100 jetty, 5 , 10. 34% – 100 .





, – 300 5 , 5 , .. 60 , 200 5 , .





, , , , jetty- .





, jetty-, JVM 1 , Docker- , . .





AHC-

AHC- - Camel HTTP. AsyncHttpClient, () . – http- , , .. 5 . , . :





from("jetty:http://localhost:8080/test")
     .log("receive request body ${body}")
     .removeHeaders("CamelHttp*")
     .to("ahc:http://{{another.url}}")
     .log("finish process body ${body}");
      
      



, 300 . , http- . JVM:





, . :





 









300 5





0%





800 5





0%





1200 5





1.533%





1600 5





15.02%





, , .





, , 1200 1600 http-, - , .





AHC-

AHC-, . :





from("jetty:http://localhost:8080/test")
     .log("receive request body ${body}")
     .removeHeaders("CamelHttp*") 
     .setHeader("rand", ()->new Random().nextInt(10000) )
     .toD("ahc:http://{{another.url}}?rand=${headers.rand}")
     .log("finish process body ${body}");

      
      



AprĂšs avoir exĂ©cutĂ© le script avec un dĂ©marrage unique de 300 requĂȘtes, l'Ă©tat des threads dans la JVM:





Comme vous pouvez le voir, il y a trop de flux. Le fait est que par défaut, le composant AHC pour chaque point de terminaison crée sa propre instance de l'objet AsyncHttpClient, chacun ayant son propre pool de connexions et de threads, par conséquent, pour chaque demande, 2 threads sont créés - un thread d'E / S, un autre thread de minuterie pour contrÎler les délais d'expiration et conserver les connexions dans l'état KeepAlive. Pour éviter cela, vous devez configurer l'instance AsyncHttpClient au niveau du composant, qui sera transmise au point de terminaison lors de sa création.





AhcComponent ahc = getContext().getComponent("ahc", AhcComponent.class);
ahc.setClient(new DefaultAsyncHttpClient());
      
      



AprĂšs cela, la crĂ©ation de nombreuses instances AsyncHttpClient s'arrĂȘtera.








All Articles