Die Handshake-Steuer
Ihre Magento-Integration könnte aufgrund versteckter Netzwerkkosten langsam sein.
Ich habe einmal einen Produktexport durchgeführt, der mit einer Preis-API kommunizierte. Ein einzelnes Produkt wurde schnell verarbeitet. Der gesamte Katalog dauerte eine Ewigkeit. Meine Datenbank war im Leerlauf. Der Profiler zeigte, dass das Netzwerk das Problem war.
Der Code erstellte innerhalb einer Schleife einen neuen HTTP-Client.
Bevor Sie Daten über HTTPS senden, leistet Ihre Maschine schwere Arbeit. Sie führt einen TCP-Handshake durch, um einen Socket zu öffnen. Dann führt sie einen TLS-Handshake durch, um Zertifikate auszutauschen und Schlüssel auszuhandeln. Dies erfordert mehrere Roundtrips.
Wenn Sie dies einmal tun, sind die Kosten gering. Wenn Sie dies innerhalb einer Schleife von 40.000 Produkten tun, zahlen Sie diese Kosten 40.000 Mal. Die eigentlichen Daten sind klein. Der Aufbau ist der teure Teil.
Bei PHP hat man oft das Gefühl, man solle einen Client erstellen und ihn dann wieder wegwerfen. Das funktioniert bei einer einzelnen Webanfrage. Bei lang laufenden Prozessen scheitert es jedoch.
Vermeiden Sie dieses Muster in Cronjobs, Konsolenbefehlen oder Message-Queue-Consumern:
- foreach ($products as $product) {
- $client = new \GuzzleHttp\Client();
- $client->post('https://api.example.com/sync', [...]);
- }
Dieser Code öffnet eine neue Verbindung und führt den vollständigen Handshake für jedes einzelne Produkt aus.
Guzzle hält Verbindungen offen, wenn Sie dieselbe Client-Instanz verwenden. Verlagern Sie den Client außerhalb Ihrer Schleife:
- $client = new \GuzzleHttp\Client(['base_uri' => 'https://api.example.com']);
- foreach ($products as $product) {
- $client->post('/sync', [...]);
- }
Nun bleiben der Socket und die TLS-Sitzung offen. Sie führen den Handshake einmal aus und streamen den Rest. In Magento sollten Sie einen konfigurierten Client über den Konstruktor injizieren, anstatt ihn manuell zu erstellen.
Dies nicht zu tun, verursacht mehr als nur Latenz. Ihnen könnten die ausgehenden Ports ausgehen. Geschlossene Verbindungen sammeln sich im Zustand TIME_WAIT schneller an, als Ihr Betriebssystem sie freigibt. Ihr Dienst wird schließlich ganz aufhören, neue Sockets zu öffnen.
Überprüfen Sie Ihren Code auf diesen Fehler. Führen Sie diesen Befehl in Ihrem Terminal aus:
grep -rn "new .*Client(" app/code | grep -i http
Suchen Sie nach jeglicher neuen Client-Erstellung innerhalb einer Schleife. Verlagern Sie den Client aus der Schleife heraus. Es ist eine Änderung in einer einzigen Zeile, die bei großen Synchronisierungen eine massive Beschleunigung bewirkt.
Source: https://dev.to/iamrobindhiman/the-handshake-tax-reuse-your-http-client-in-magento-integrations-3kk7
