Cukai Handshake
Integrasi Magento anda mungkin perlahan disebabkan oleh kos rangkaian yang tersembunyi.
Saya pernah menjalankan eksport produk yang berinteraksi dengan API harga. Satu produk berfungsi dengan pantas. Katalog penuh mengambil masa yang sangat lama. Pangkalan data saya tidak aktif. Profiler menunjukkan masalahnya adalah rangkaian.
Kod tersebut mencipta klien HTTP baharu di dalam satu gelung (loop).
Sebelum anda menghantar data melalui HTTPS, mesin anda melakukan kerja yang berat. Ia melakukan handshake TCP untuk membuka soket. Kemudian, ia melakukan handshake TLS untuk bertukar sijil dan merundingkan kunci. Ini memerlukan beberapa pusingan (round trips).
Jika anda melakukan ini sekali, kosnya rendah. Jika anda melakukannya di dalam gelung bagi 40,000 produk, anda membayar kos tersebut sebanyak 40,000 kali. Data sebenar adalah kecil. Proses penyediaan (setup) adalah bahagian yang mahal.
PHP sering kali membuatkan anda rasa seolah-olah anda patut membina satu klien dan membuangnya. Ini berfungsi untuk satu permintaan web tunggal. Ia gagal dalam proses yang berjalan lama.
Elakkan corak ini dalam tugasan cron (cron jobs), arahan konsol, atau pengguna barisan mesej (message queue consumers):
- foreach ($products as $product) {
- $client = new \GuzzleHttp\Client();
- $client->post('https://api.example.com/sync', [...]);
- }
Kod ini membuka sambungan baharu dan menjalankan handshake penuh bagi setiap satu produk.
Guzzle mengekalkan sambungan tetap aktif jika anda menggunakan instans klien yang sama. Alihkan klien ke luar gelung anda:
- $client = new \GuzzleHttp\Client(['base_uri' => 'https://api.example.com']);
- foreach ($products as $product) {
- $client->post('/sync', [...]);
- }
Kini soket dan sesi TLS kekal terbuka. Anda melakukan handshake sekali dan menstrim selebihnya. Dalam Magento, suntik (inject) klien yang telah dikonfigurasi melalui pembina (constructor) anda dan bukannya menciptanya secara manual.
Kegagalan untuk melakukan ini menyebabkan lebih daripada sekadar kependaman (latency). Anda boleh kehabisan port keluar (outbound ports). Sambungan yang ditutup akan terkumpul dalam TIME_WAIT lebih cepat daripada OS anda mengambilnya semula. Perkhidmatan anda akan berhenti membuka soket baharu sepenuhnya.
Semak kod anda untuk kesilapan ini. Jalankan arahan ini dalam terminal anda:
grep -rn "new .*Client(" app/code | grep -i http
Cari sebarang penciptaan klien baharu yang berada di dalam gelung. Alihkan klien keluar daripada gelung. Ia adalah perubahan satu baris yang memberikan peningkatan kelajuan yang besar untuk penyinkronan (sync) yang besar.
Source: https://dev.to/iamrobindhiman/the-handshake-tax-reuse-your-http-client-in-magento-integrations-3kk7
