The Handshake Tax
ஒரு மறைமுகமான நெட்வொர்க் செலவின் காரணமாக உங்கள் Magento integration மெதுவாக இருக்கலாம்.
ஒருமுறை நான் ஒரு pricing API-யுடன் தொடர்பு கொள்ளும் வகையில் ஒரு தயாரிப்பு ஏற்றுமதி (product export) பணத்தை இயக்கினேன். ஒரு தயாரிப்பு மிக வேகமாகச் செயல்பட்டது. ஆனால் முழுப் பட்டியலையும் (catalog) ஏற்றுவதற்கு நீண்ட நேரம் எடுத்தது. எனது தரவுத்தளம் (database) சும்மா இருந்தது. Profiler மூலம் பார்த்தபோது, பிரச்சனை நெட்வொர்க்கில் தான் இருப்பது தெரியவந்தது.
அந்த நிரல் (code) ஒரு லூப்பிற்குள் (loop) புதிய HTTP client-ஐ உருவாக்கியது.
நீங்கள் HTTPS வழியாகத் தரவை அனுப்பும் முன், உங்கள் கணினி அதிக வேலைகளைச் செய்கிறது. ஒரு socket-ஐத் திறக்க அது TCP handshake-ஐச் செய்கிறது. பின்னர் சான்றிதழ்களைப் பரிமாறிக்கொள்ளவும், சாவிகளை (keys) negotiate செய்யவும் அது TLS handshake-ஐச் செய்கிறது. இதற்குப் பலமுறை தரவுப் பரிமாற்றம் (round trips) தேவைப்படுகிறது.
இதை நீங்கள் ஒருமுறை செய்தால், அதன் சுமை குறைவு. ஆனால் 40,000 தயாரிப்புகள் கொண்ட ஒரு லூப்பிற்குள் இதைச் செய்தால், அந்தச் சுமையை நீங்கள் 40,000 முறை சுமக்க வேண்டியிருக்கும். உண்மையான தரவு சிறியதுதான், ஆனால் அந்தத் தயாரிப்புக்கான setup-தே அதிகச் செலவை ஏற்படுத்துகிறது.
PHP-யில் ஒரு client-ஐ உருவாக்கிவிட்டுப் பிறகு அதைத் தூக்கி எறிந்துவிடுவது போலத் தோன்றும். இது ஒரு ஒற்றை இணையக் கோரிக்கைக்கு (single web request) வேலை செய்யும். ஆனால் நீண்ட நேரம் இயங்கும் செயல்முறைகளில் (long-running processes) இது தோல்வியடையும்.
cron jobs, console commands அல்லது message queue consumers ஆகியவற்றில் இந்த முறையைத் தவிர்க்கவும்:
- foreach ($products as $product) {
- $client = new \GuzzleHttp\Client();
- $client->post('https://api.example.com/sync', [...]);
- }
இந்த நிரல் ஒவ்வொரு தயாரிப்பிற்கும் ஒரு புதிய இணைப்பைத் திறந்து, முழு handshake-ஐயும் இயக்குகிறது.
நீங்கள் ஒரே client instance-ஐப் பயன்படுத்தினால், Guzzle இணைப்புகளைத் தொடர்ந்து உயிர்ப்புடன் (alive) வைத்திருக்கும். client-ஐ உங்கள் லூப்பிற்கு வெளியே கொண்டு வாருங்கள்:
- $client = new \GuzzleHttp\Client(['base_uri' => 'https://api.example.com']);
- foreach ($products as $product) {
- $client->post('/sync', [...]);
- }
இப்போது socket மற்றும் TLS session ஆகியவை திறந்தே இருக்கும். நீங்கள் ஒருமுறை handshake செய்துவிட்டு, மீதமுள்ளவற்றைத் தொடர்ச்சியாக (stream) அனுப்பலாம். Magento-வில், ஒரு client-ஐத் தானாக உருவாக்குவதற்குப் பதிலாக, உங்கள் constructor மூலம் ஏற்கனவே கட்டமைக்கப்பட்ட (configured) client-ஐ inject செய்யவும்.
இதைச் செய்யத் தவறினால், தாமதம் (latency) மட்டுமல்லாமல் வேறு சிக்கல்களும் ஏற்படும். உங்கள் outbound ports தீர்ந்து போகலாம். மூடப்பட்ட இணைப்புகள் (closed connections), உங்கள் OS அவற்றை மீட்டெடுப்பதற்கு முன்பே TIME_WAIT நிலையில் வேகமாகத் தேங்கத் தொடங்கும். இதனால் உங்கள் சேவை புதிய sockets-களைத் திறப்பதே முற்றிலும் நின்றுவிடும்.
உங்கள் நிரலில் இத்தகைய தவறு உள்ளதா என்று சரிபார்க்கவும். உங்கள் terminal-இல் இந்த கட்டளையை இயக்கவும்:
grep -rn "new .*Client(" app/code | grep -i http
லூப்பிற்குள் புதிய client உருவாக்கப்படுகிறதா என்று பாருங்கள். client-ஐ லூப்பிற்கு வெளியே நகர்த்தவும். இது ஒரு வரியின் மாற்றம் மட்டுமே, ஆனால் பெரிய அளவிலான sync பணிகளுக்கு இது மிகப்பெரிய வேகத்தை வழங்கும்.
Source: https://dev.to/iamrobindhiman/the-handshake-tax-reuse-your-http-client-in-magento-integrations-3kk7
