हँडशेक टॅक्स

तुमचे Magento इंटिग्रेशन एका लपलेल्या नेटवर्क खर्चामुळे (network cost) संथ असू शकते.

मी एकदा एका प्रॉडक्ट एक्सपोर्टची प्रक्रिया राबवली जी एका प्राइसिंग API शी संवाद साधत होती. एक प्रॉडक्ट वेगाने काम करत होते. पण संपूर्ण कॅटलॉगसाठी खूप वेळ लागला. माझा डेटाबेस आयडल (idle) होता. प्रोफायलरने दाखवले की समस्या नेटवर्कमध्ये होती.

कोडमध्ये लूपच्या आत एक नवीन HTTP क्लायंट तयार केला जात होता.

HTTPS द्वारे डेटा पाठवण्यापूर्वी, तुमचे मशीन मोठे काम करते. सॉकेट उघडण्यासाठी ते TCP हँडशेक करते. त्यानंतर प्रमाणपत्रे (certificates) बदलण्यासाठी आणि कीज (keys) ठरवण्यासाठी ते TLS हँडशेक करते. यासाठी अनेक राऊंड ट्रिप्स लागतात.

जर तुम्ही हे एकदा केले, तर खर्च कमी असतो. पण जर तुम्ही हे ४०,००० प्रॉडक्ट्सच्या लूपमध्ये केले, तर तुम्हाला तो खर्च ४०,००० वेळा द्यावा लागतो. प्रत्यक्ष डेटा लहान असतो, पण सेटअप करणे हा खर्चिक भाग असतो.

PHP मध्ये अनेकदा असे वाटते की तुम्ही क्लायंट तयार करावा आणि वापरून झाल्यावर तो काढून टाकावा. हे एका सिंगल वेब रिक्वेस्टसाठी काम करते, पण दीर्घकाळ चालणाऱ्या (long-running) प्रोसेसमध्ये ते अपयशी ठरते.

क्रॉन जॉब्स (cron jobs), कन्सोल कमांड्स किंवा मेसेज क्यू कन्स्युमर्समध्ये (message queue consumers) हा पॅटर्न टाळा:

हा कोड प्रत्येक प्रॉडक्टसाठी नवीन कनेक्शन उघडतो आणि पूर्ण हँडशेक प्रक्रिया राबवतो.

जर तुम्ही एकाच क्लायंट इन्स्टन्सचा वापर केला, तर 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) संपू शकतात. क्लोज्ड कनेक्शन्स तुमच्या OS ने रिकलेम करण्याच्या वेगापेक्षा वेगाने TIME_WAIT मध्ये साठू लागतात. यामुळे तुमची सर्व्हिस नवीन सॉकेट्स उघडणे पूर्णपणे थांबवू शकते.

तुमच्या कोडमध्ये ही चूक आहे का ते तपासा. तुमच्या टर्मिनलमध्ये ही कमांड चालवा:

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

लूपच्या आत कुठे नवीन क्लायंट तयार केला जात आहे का ते पहा. क्लायंटला लूपच्या बाहेर हलवा. हा एक ओळीचा बदल मोठ्या सिंक (sync) प्रक्रियांसाठी प्रचंड वेग देऊ शकतो.

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