हैंडशेक टैक्स

आपका Magento इंटीग्रेशन एक छिपी हुई नेटवर्क लागत (network cost) के कारण धीमा हो सकता है।

एक बार मैंने एक प्रोडक्ट एक्सपोर्ट चलाया जो एक प्राइसिंग API से जुड़ा था। एक प्रोडक्ट तेज़ी से काम कर गया। लेकिन पूरे कैटलॉग में बहुत लंबा समय लग गया। मेरा डेटाबेस खाली (idle) बैठा था। प्रोफाइलर ने दिखाया कि समस्या नेटवर्क में थी।

कोड लूप के अंदर एक नया HTTP क्लाइंट बना रहा था।

HTTPS के माध्यम से डेटा भेजने से पहले, आपका सिस्टम काफी भारी काम करता है। यह सॉकेट खोलने के लिए TCP हैंडशेक करता है। फिर यह सर्टिफिकेट्स का आदान-प्रदान करने और कीज़ (keys) को नेगोशिएट करने के लिए TLS हैंडशेक करता है। इसमें कई राउंड ट्रिप्स (round trips) लगते हैं।

अगर आप इसे एक बार करते हैं, तो लागत कम होती है। लेकिन अगर आप इसे 40,000 प्रोडक्ट्स के लूप के अंदर करते हैं, तो आपको यह लागत 40,000 बार चुकानी पड़ती है। वास्तविक डेटा छोटा होता है, लेकिन सेटअप ही सबसे महंगा हिस्सा है।

PHP में अक्सर ऐसा लगता है कि आपको एक क्लाइंट बनाना चाहिए और फिर उसे हटा देना चाहिए। यह एक सिंगल वेब रिक्वेस्ट के लिए तो ठीक है, लेकिन लंबे समय तक चलने वाली प्रक्रियाओं (long-running processes) में यह विफल हो जाता है।

क्रोन जॉब्स (cron jobs), कंसोल कमांड्स, या मैसेज क्यू कंज्यूमर्स में इस पैटर्न से बचें:

यह कोड हर एक प्रोडक्ट के लिए एक नया कनेक्शन खोलता है और पूरा हैंडशेक रन करता है।

अगर आप एक ही क्लाइंट इंस्टेंस का उपयोग करते हैं, तो Guzzle कनेक्शन को चालू (alive) रखता है। क्लाइंट को अपने लूप के बाहर ले जाएँ:

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

अब सॉकेट और TLS सेशन खुले रहते हैं। आप केवल एक बार हैंडशेक करते हैं और बाकी डेटा स्ट्रीम कर देते हैं। Magento में, क्लाइंट को मैन्युअल रूप से बनाने के बजाय अपने कंस्ट्रक्टर (constructor) के माध्यम से एक कॉन्फ़िगर किया गया क्लाइंट इंजेक्ट करें।

ऐसा न करने से केवल लेटेंसी (latency) ही नहीं बढ़ती, बल्कि आपके आउटबाउंड पोर्ट्स (outbound ports) भी खत्म हो सकते हैं। बंद हुए कनेक्शन TIME_WAIT में आपके OS द्वारा उन्हें वापस लेने की तुलना में तेज़ी से जमा होने लगते हैं। आपकी सर्विस नए सॉकेट खोलना पूरी तरह से बंद कर देगी।

अपने कोड में इस गलती की जाँच करें। अपने टर्मिनल में यह कमांड चलाएँ:

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

लूप के अंदर किसी भी नए क्लाइंट क्रिएशन को ढूँढें। क्लाइंट को लूप से बाहर निकालें। यह केवल एक लाइन का बदलाव है जो बड़े सिंक (syncs) के लिए जबरदस्त स्पीड प्रदान करता है।

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