La taxe du handshake
Votre intégration Magento est peut-être lente à cause d'un coût réseau caché.
J'ai un jour lancé un export de produits qui communiquait avec une API de tarification. Un produit s'est traité rapidement. Le catalogue complet a pris une éternité. Ma base de données était inactive. Le profiler a montré que le problème venait du réseau.
Le code créait un nouveau client HTTP à l'intérieur d'une boucle.
Avant d'envoyer des données via HTTPS, votre machine effectue un travail important. Elle réalise un handshake TCP pour ouvrir un socket. Ensuite, elle effectue un handshake TLS pour échanger des certificats et négocier des clés. Cela nécessite plusieurs allers-retours (round trips).
Si vous faites cela une seule fois, le coût est faible. Si vous le faites à l'intérieur d'une boucle de 40 000 produits, vous payez ce coût 40 000 fois. Les données réelles sont peu volumineuses. C'est la phase de configuration qui est la plus coûteuse.
Avec PHP, on a souvent l'impression qu'il faut construire un client puis s'en débarrasser. Cela fonctionne pour une requête web unique. Cela échoue dans les processus de longue durée.
Évitez ce modèle dans les tâches cron, les commandes console ou les consommateurs de files d'attente (message queues) :
- foreach ($products as $product) {
- $client = new \GuzzleHttp\Client();
- $client->post('https://api.example.com/sync', [...]);
- }
Ce code ouvre une nouvelle connexion et exécute l'intégralité du handshake pour chaque produit.
Guzzle maintient les connexions actives si vous utilisez la même instance de client. Déplacez le client en dehors de votre boucle :
- $client = new \GuzzleHttp\Client(['base_uri' => 'https://api.example.com']);
- foreach ($products as $product) {
- $client->post('/sync', [...]);
- }
Désormais, le socket et la session TLS restent ouverts. Vous effectuez le handshake une seule fois et transférez le reste en flux continu. Dans Magento, injectez un client configuré via votre constructeur au lieu de le créer manuellement.
Ne pas le faire entraîne plus qu'une simple latence. Vous pouvez manquer de ports de sortie. Les connexions fermées s'accumulent en état TIME_WAIT plus rapidement que votre système d'exploitation ne les récupère. Votre service finira par ne plus pouvoir ouvrir de nouveaux sockets du tout.
Vérifiez si votre code contient cette erreur. Exécutez cette commande dans votre terminal :
grep -rn "new .*Client(" app/code | grep -i http
Recherchez toute création de nouveau client située à l'intérieur d'une boucle. Sortez le client de la boucle. C'est un changement d'une seule ligne qui permet un gain de vitesse massif pour les synchronisations volumineuses.
Source: https://dev.to/iamrobindhiman/the-handshake-tax-reuse-your-http-client-in-magento-integrations-3kk7
