The Handshake Tax
Tu integración con Magento podría ser lenta debido a un coste de red oculto.
Una vez ejecuté una exportación de productos que se comunicaba con una API de precios. Un producto funcionaba rápido. El catálogo completo tardaba una eternidad. Mi base de datos estaba inactiva. El profiler mostró que el problema era la red.
El código creaba un nuevo cliente HTTP dentro de un bucle.
Antes de enviar datos a través de HTTPS, tu máquina realiza un trabajo pesado. Realiza un handshake TCP para abrir un socket. Luego, realiza un handshake TLS para intercambiar certificados y negociar claves. Esto requiere varios viajes de ida y vuelta.
Si haces esto una vez, el coste es bajo. Si lo haces dentro de un bucle de 40.000 productos, pagas ese coste 40.000 veces. Los datos reales son pequeños. La configuración es la parte costosa.
A menudo, con PHP, parece que deberías crear un cliente y descartarlo. Esto funciona para una única solicitud web, pero falla en procesos de larga duración.
Evita este patrón en tareas cron, comandos de consola o consumidores de colas de mensajes:
- foreach ($products as $product) {
- $client = new \GuzzleHttp\Client();
- $client->post('https://api.example.com/sync', [...]);
- }
Este código abre una nueva conexión y ejecuta el handshake completo para cada producto.
Guzzle mantiene las conexiones abiertas si utilizas la misma instancia del cliente. Mueve el cliente fuera de tu bucle:
- $client = new \GuzzleHttp\Client(['base_uri' => 'https://api.example.com']);
- foreach ($products as $product) {
- $client->post('/sync', [...]);
- }
Ahora el socket y la sesión TLS permanecen abiertos. Realizas el handshake una vez y transmites el resto. En Magento, inyecta un cliente configurado a través de tu constructor en lugar de crearlo manualmente.
No hacer esto causa algo más que simple latencia. Puedes quedarte sin puertos de salida. Las conexiones cerradas se acumulan en TIME_WAIT más rápido de lo que tu sistema operativo las libera. Tu servicio dejará de abrir sockets por completo.
Revisa tu código en busca de este error. Ejecuta este comando en tu terminal:
grep -rn "new .*Client(" app/code | grep -i http
Busca cualquier creación de un nuevo cliente que esté dentro de un bucle. Saca el cliente del bucle. Es un cambio de una sola línea que proporciona una aceleración masiva para las sincronizaciones grandes.
Fuente: https://dev.to/iamrobindhiman/the-handshake-tax-reuse-your-http-client-in-magento-integrations-3kk7
