O Imposto do Handshake
Sua integração com Magento pode estar lenta devido a um custo de rede oculto.
Certa vez, executei uma exportação de produtos que se comunicava com uma API de preços. Um produto funcionou rápido. O catálogo completo demorou uma eternidade. Meu banco de dados estava ocioso. O profiler mostrou que o problema era a rede.
O código criava um novo cliente HTTP dentro de um loop.
Antes de enviar dados via HTTPS, sua máquina realiza um trabalho pesado. Ela executa um handshake TCP para abrir um socket. Em seguida, realiza um handshake TLS para trocar certificados e negociar chaves. Isso exige várias viagens de ida e volta (round trips).
Se você fizer isso uma vez, o custo é baixo. Se fizer isso dentro de um loop de 40.000 produtos, você pagará esse custo 40.000 vezes. Os dados reais são pequenos. A configuração é a parte cara.
No PHP, muitas vezes parece que você deve construir um cliente e descartá-lo. Isso funciona para uma única requisição web. Falha em processos de longa duração.
Evite este padrão em cron jobs, comandos de console ou consumidores de filas de mensagens:
- foreach ($products as $product) {
- $client = new \GuzzleHttp\Client();
- $client->post('https://api.example.com/sync', [...]);
- }
Este código abre uma nova conexão e executa o handshake completo para cada produto individualmente.
O Guzzle mantém as conexões vivas se você usar a mesma instância do cliente. Mova o cliente para fora do seu loop:
- $client = new \GuzzleHttp\Client(['base_uri' => 'https://api.example.com']);
- foreach ($products as $product) {
- $client->post('/sync', [...]);
- }
Agora, o socket e a sessão TLS permanecem abertos. Você faz o handshake uma vez e transmite o restante. No Magento, injete um cliente configurado através do seu construtor em vez de criá-lo manualmente.
Não fazer isso causa mais do que apenas latência. Você pode ficar sem portas de saída. Conexões fechadas se acumulam em TIME_WAIT mais rápido do que o seu SO as recupera. Seu serviço parará de abrir novos sockets completamente.
Verifique se há esse erro no seu código. Execute este comando no seu terminal:
grep -rn "new .*Client(" app/code | grep -i http
Procure por qualquer criação de novo cliente dentro de um loop. Mova o cliente para fora do loop. É uma mudança de uma única linha que proporciona um aumento massivo de velocidade para sincronizações grandes.
Source: https://dev.to/iamrobindhiman/the-handshake-tax-reuse-your-http-client-in-magento-integrations-3kk7
