The Handshake Tax

La tua integrazione Magento potrebbe essere lenta a causa di un costo di rete nascosto.

Una volta ho eseguito un'esportazione di prodotti che comunicava con un'API di pricing. Un singolo prodotto veniva elaborato velocemente. L'intero catalogo richiedeva un'eternità. Il mio database era inattivo. Il profiler ha mostrato che il problema era la rete.

Il codice creava un nuovo client HTTP all'interno di un ciclo.

Prima di inviare dati via HTTPS, la tua macchina compie un lavoro pesante. Esegue un handshake TCP per aprire un socket. Poi esegue un handshake TLS per scambiare certificati e negoziare le chiavi. Questo richiede diversi round trip.

Se lo fai una volta, il costo è basso. Se lo fai all'interno di un ciclo di 40.000 prodotti, paghi quel costo 40.000 volte. I dati effettivi sono piccoli. La configurazione è la parte costosa.

Con PHP spesso sembra che tu debba creare un client e poi scartarlo. Questo funziona per una singola richiesta web, ma fallisce nei processi a lunga esecuzione.

Evita questo pattern nei cron job, nei comandi da console o nei consumer delle code di messaggi:

Questo codice apre una nuova connessione ed esegue l'handshake completo per ogni singolo prodotto.

Guzzle mantiene le connessioni attive se utilizzi la stessa istanza del client. Sposta il client all'esterno del ciclo:

  • $client = new \GuzzleHttp\Client(['base_uri' => 'https://api.example.com']);
  • foreach ($products as $product) {
  • $client->post('/sync', [...]);
  • }

Ora il socket e la sessione TLS rimangono aperti. Esegui l'handshake una sola volta e trasmetti il resto. In Magento, iniettate un client configurato tramite il costruttore invece di crearlo manualmente.

Non farlo causa problemi che vanno oltre la semplice latenza. Potresti esaurire le porte in uscita. Le connessioni chiuse si accumulano in TIME_WAIT più velocemente di quanto il tuo sistema operativo riesca a recuperarle. Il tuo servizio smetterà completamente di aprire nuovi socket.

Controlla il tuo codice per questo errore. Esegui questo comando nel tuo terminale:

grep -rn "new .*Client(" app/code | grep -i http

Cerca qualsiasi creazione di un nuovo client all'interno di un ciclo. Sposta il client fuori dal ciclo. È una modifica di una sola riga che garantisce un enorme aumento di velocità per le sincronizzazioni di grandi dimensioni.

Fonte: https://dev.to/iamrobindhiman/the-handshake-tax-reuse-your-http-client-in-magento-integrations-3kk7