Pajak Handshake
Integrasi Magento Anda mungkin lambat karena adanya biaya jaringan yang tersembunyi.
Saya pernah menjalankan ekspor produk yang terhubung ke API harga. Satu produk berjalan cepat. Namun, seluruh katalog memakan waktu sangat lama. Database saya menganggur. Profiler menunjukkan bahwa masalahnya ada pada jaringan.
Kode tersebut membuat HTTP client baru di dalam sebuah loop.
Sebelum Anda mengirim data melalui HTTPS, mesin Anda melakukan pekerjaan berat. Ia melakukan TCP handshake untuk membuka socket. Kemudian, ia melakukan TLS handshake untuk bertukar sertifikat dan menegosiasikan kunci. Hal ini membutuhkan beberapa kali putaran (round trips).
Jika Anda melakukan ini sekali, biayanya rendah. Jika Anda melakukannya di dalam loop berisi 40.000 produk, Anda membayar biaya tersebut sebanyak 40.000 kali. Data yang sebenarnya berukuran kecil. Bagian pengaturannya (setup) lah yang mahal.
Dalam PHP, sering kali terasa seolah-olah Anda harus membuat client lalu membuangnya. Ini berhasil untuk satu permintaan web tunggal. Namun, ini gagal dalam proses yang berjalan lama (long-running processes).
Hindari pola ini dalam cron jobs, console commands, atau message queue consumers:
- foreach ($products as $product) {
- $client = new \GuzzleHttp\Client();
- $client->post('https://api.example.com/sync', [...]);
- }
Kode ini membuka koneksi baru dan menjalankan handshake lengkap untuk setiap produk.
Guzzle menjaga koneksi tetap hidup jika Anda menggunakan instance client yang sama. Pindahkan client ke luar loop Anda:
- $client = new \GuzzleHttp\Client(['base_uri' => 'https://api.example.com']);
- foreach ($products as $product) {
- $client->post('/sync', [...]);
- }
Sekarang socket dan sesi TLS tetap terbuka. Anda melakukan handshake sekali dan melakukan streaming untuk sisanya. Di Magento, suntikkan (inject) client yang sudah dikonfigurasi melalui constructor Anda, alih-alih membuatnya secara manual.
Kegagalan dalam melakukan hal ini menyebabkan lebih dari sekadar latensi. Anda bisa kehabisan outbound ports. Koneksi yang tertutup menumpuk di TIME_WAIT lebih cepat daripada kemampuan OS untuk mengambilnya kembali. Layanan Anda akan berhenti membuka socket baru sepenuhnya.
Periksa kode Anda untuk kesalahan ini. Jalankan perintah ini di terminal Anda:
grep -rn "new .*Client(" app/code | grep -i http
Cari pembuatan client baru yang berada di dalam loop. Pindahkan client ke luar loop. Ini adalah perubahan satu baris yang memberikan peningkatan kecepatan masif untuk sinkronisasi skala besar.
Source: https://dev.to/iamrobindhiman/the-handshake-tax-reuse-your-http-client-in-magento-integrations-3kk7
