హ్యాండ్షేక్ పన్ను (The Handshake Tax)
మీ Magento ఇంటిగ్రేషన్ ఒక దాగి ఉన్న నెట్వర్క్ ఖర్చు (network cost) కారణంగా నెమ్మదిగా ఉండవచ్చు.
ఒకసారి నేను ఒక ప్రైసింగ్ APIతో కనెక్ట్ అయ్యే ప్రొడక్ట్ ఎక్స్పోర్ట్ను రన్ చేశాను. ఒక ప్రొడక్ట్ చాలా వేగంగా పనిచేసింది. కానీ పూర్తి క్యాటలాగ్ పూర్తి కావడానికి చాలా సమయం పట్టింది. నా డేటాబేస్ ఖాళీగానే (idle) ఉంది. ప్రొఫైలర్ (profiler) ప్రకారం సమస్య నెట్వర్క్లోనే ఉందని తెలిసింది.
కోడ్ ఒక లూప్ (loop) లోపల కొత్త HTTP క్లయింట్ను సృష్టిస్తోంది.
మీరు HTTPS ద్వారా డేటాను పంపే ముందు, మీ మెషిన్ భారీ పనిని చేస్తుంది. ఒక సాకెట్ను (socket) తెరవడానికి అది TCP హ్యాండ్షేక్ను నిర్వహిస్తుంది. ఆ తర్వాత సర్టిఫికేట్లను మార్పిడి చేయడానికి మరియు కీలను (keys) చర్చించడానికి (negotiate) TLS హ్యాండ్షేక్ను నిర్వహిస్తుంది. దీనికి అనేక రౌండ్ ట్రిప్స్ (round trips) పడుతుంది.
మీరు దీనిని ఒక్కసారి చేస్తే, ఖర్చు తక్కువ. కానీ 40,000 ప్రొడక్ట్ల లూప్లో దీనిని చేస్తే, మీరు ఆ ఖర్చును 40,000 సార్లు చెల్లించాల్సి వస్తుంది. అసలు డేటా తక్కువగానే ఉంటుంది. కానీ సెటప్ (setup) చేసే ప్రక్రియే ఖరీదైనది.
PHPలో తరచుగా ఒక క్లయింట్ను నిర్మించి, పని అయిపోగానే వదిలేయాలని అనిపిస్తుంది. ఇది ఒకే ఒక్క వెబ్ రిక్వెస్ట్కు పని చేస్తుంది. కానీ ఎక్కువ సమయం నడిచే ప్రాసెస్లలో (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', [...]);
- }
ఈ కోడ్ ప్రతి ప్రొడక్ట్ కోసం కొత్త కనెక్షన్ను తెరుస్తుంది మరియు పూర్తి హ్యాండ్షేక్ను రన్ చేస్తుంది.
మీరు ఒకే క్లయింట్ ఇన్స్టెన్స్ను ఉపయోగిస్తే, Guzzle కనెక్షన్లను లైవ్ (alive) గా ఉంచుతుంది. క్లయింట్ను మీ లూప్ వెలుపల ఉంచండి:
- $client = new \GuzzleHttp\Client(['base_uri' => 'https://api.example.com']);
- foreach ($products as $product) {
- $client->post('/sync', [...]);
- }
ఇప్పుడు సాకెట్ మరియు TLS సెషన్ ఓపెన్గా ఉంటాయి. మీరు ఒక్కసారి హ్యాండ్షేక్ చేసి, మిగిలిన డేటాను స్ట్రీమ్ చేయవచ్చు. Magentoలో, క్లయింట్ను మాన్యువల్గా సృష్టించే బదులు, మీ కన్స్ట్రక్టర్ (constructor) ద్వారా కాన్ఫిగర్ చేయబడిన క్లయింట్ను ఇంజెక్ట్ (inject) చేయండి.
ఇలా చేయకపోవడం వల్ల కేవలం లాటెన్సీ (latency) మాత్రమే కాదు, మరిన్ని సమస్యలు వస్తాయి. మీ అవుట్బౌండ్ పోర్ట్లు (outbound ports) అయిపోవచ్చు. క్లోజ్ చేసిన కనెక్షన్లు మీ OS వాటిని తిరిగి సేకరించే (reclaim) వేగం కంటే TIME_WAIT లో వేగంగా పేరుకుపోతాయి. దీనివల్ల మీ సర్వీస్ కొత్త సాకెట్లను తెరవడం పూర్తిగా ఆపేస్తుంది.
మీ కోడ్లో ఈ తప్పు ఉందో లేదో తనిఖీ చేయండి. మీ టెర్మినల్లో ఈ కమాండ్ను రన్ చేయండి:
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
