Podatek od handshake'a

Twoja integracja z Magento może działać wolno z powodu ukrytego kosztu sieciowego.

Raz uruchomiłem eksport produktów, który komunikował się z API cenowym. Jeden produkt przetworzył się szybko. Pełny katalog zajął wieczność. Moja baza danych była bezczynna. Profiler wykazał, że problemem była sieć.

Kod tworzył nowy klient HTTP wewnątrz pętli.

Zanim wyślesz dane przez HTTPS, Twój komputer wykonuje ciężką pracę. Najpierw wykonuje handshake TCP, aby otworzyć gniazdo (socket). Następnie wykonuje handshake TLS, aby wymienić certyfikaty i wynegocjować klucze. Wymaga to kilku cykli komunikacji (round trips).

Jeśli robisz to raz, koszt jest niski. Jeśli robisz to wewnątrz pętli dla 40 000 produktów, płacisz ten koszt 40 000 razy. Same dane są niewielkie. Kosztowny jest sam proces konfiguracji.

W PHP często odnosi się wrażenie, że należy stworzyć klienta i go odrzucić. Działa to przy pojedynczym żądaniu HTTP. Zawodzi jednak w procesach długotrwałych.

Unikaj tego wzorca w zadaniach cron, komendach konsolowych lub konsumentach kolejek wiadomości:

Ten kod otwiera nowe połączenie i wykonuje pełny handshake dla każdego pojedynczego produktu.

Guzzle utrzymuje połączenia przy życiu, jeśli używasz tej samej instancji klienta. Przenieś klienta poza pętlę:

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

Teraz gniazdo i sesja TLS pozostają otwarte. Wykonujesz handshake raz, a resztę przesyłasz strumieniowo. W Magento wstrzykuj skonfigurowanego klienta przez konstruktor, zamiast tworzyć go ręcznie.

Brak zastosowania tego rozwiązania powoduje coś więcej niż tylko opóźnienia. Możesz wyczerpać dostępne porty wychodzące. Zamknięte połączenia gromadzą się w stanie TIME_WAIT szybciej, niż system operacyjny je odzyskuje. Twoja usługa całkowicie przestanie otwierać nowe gniazda.

Sprawdź swój kod pod kątem tego błędu. Uruchom tę komendę w terminalu:

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

Szukaj tworzenia nowych instancji klienta wewnątrz pętli. Przenieś klienta poza pętlę. To zmiana jednej linii kodu, która zapewnia ogromne przyspieszenie przy dużych synchronizacjach.

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