The Handshake Vergisi

Magento entegrasyonunuz, gizli bir ağ maliyeti nedeniyle yavaş olabilir.

Bir keresinde, bir fiyatlandırma API'si ile iletişim kuran bir ürün dışa aktarma işlemi çalıştırdım. Tek bir ürün hızlıca işlendi. Ancak tüm kataloğun tamamlanması sonsuz sürdü. Veritabanım boşta bekliyordu. Profil oluşturucu (profiler), sorunun ağ kaynaklı olduğunu gösterdi.

Kod, bir döngü içerisinde yeni bir HTTP istemcisi (client) oluşturuyordu.

HTTPS üzerinden veri göndermeden önce, makineniz ağır bir iş yükü altına girer. Bir soket açmak için TCP handshake gerçekleştirir. Ardından, sertifikaları değiş tokuş etmek ve anahtarları müzakere etmek için TLS handshake gerçekleştirir. Bu işlem birkaç gidiş-dönüş (round trip) gerektirir.

Bunu bir kez yaparsanız maliyet düşüktür. Ancak bunu 40.000 ürünlük bir döngü içinde yaparsanız, bu maliyeti 40.000 kez ödersiniz. Asıl veri küçüktür; asıl maliyetli olan kurulum kısmıdır.

PHP'de genellikle bir istemci oluşturup işiniz bitince onu çöpe atmanız gerekiyormuş gibi hissedilir. Bu, tek bir web isteği için işe yarar; ancak uzun süren süreçlerde (long-running processes) başarısız olur.

Cron işlerinde, konsol komutlarında veya mesaj kuyruğu tüketicilerinde (message queue consumers) bu desenden kaçının:

Bu kod, her bir ürün için yeni bir bağlantı açar ve tüm handshake işlemini gerçekleştirir.

Aynı istemci örneğini (instance) kullanırsanız, Guzzle bağlantıları canlı tutar. İstemciyi döngünüzün dışına taşıyın:

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

Artık soket ve TLS oturumu açık kalır. Bir kez handshake yapar ve geri kalanını akış (stream) halinde gönderirsiniz. Magento'da, istemciyi manuel olarak oluşturmak yerine, yapılandırılmış bir istemciyi constructor aracılığıyla enjekte edin.

Bunu yapmamak sadece gecikmeye (latency) neden olmaz. Çıkış portlarınız (outbound ports) tükenebilir. Kapatılan bağlantılar, işletim sisteminizin onları geri kazanmasından daha hızlı bir şekilde TIME_WAIT durumunda birikir. Servisiniz yeni soket açmayı tamamen durduracaktır.

Kodunuzda bu hatayı kontrol edin. Terminalinizde şu komutu çalıştırın:

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

Döngü içinde yer alan herhangi bir yeni istemci oluşturma işlemi olup olmadığına bakın. İstemciyi döngünün dışına çıkarın. Bu, büyük senkronizasyonlar için muazzam bir hız artışı sağlayan tek satırlık bir değişikliktir.

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