હેન્ડશેક ટેક્સ
તમારી Magento ઇન્ટિગ્રેશન એક છુપા નેટવર્ક ખર્ચને કારણે ધીમી હોઈ શકે છે.
મેં એકવાર પ્રોડક્ટ એક્સપોર્ટ ચલાવ્યું હતું જે પ્રાઇસિંગ API સાથે વાત કરતું હતું. એક પ્રોડક્ટ ઝડપથી કામ કરી ગઈ. આખું કેટલોગ પૂર્ણ થવામાં ઘણો સમય લાગ્યો. મારો ડેટાબેઝ નિષ્ક્રિય (idle) હતો. પ્રોફાઇલરે બતાવ્યું કે સમસ્યા નેટવર્કની હતી.
કોડ લૂપની અંદર નવો HTTP ક્લાયન્ટ બનાવી રહ્યો હતો.
HTTPS દ્વારા ડેટા મોકલતા પહેલા, તમારું મશીન ભારે કામ કરે છે. તે સોકેટ ખોલવા માટે TCP હેન્ડશેક કરે છે. ત્યારબાદ તે પ્રમાણપત્રો (certificates)ની આપ-લે કરવા અને કી (keys) ને નેગોશિયેટ કરવા માટે TLS હેન્ડશેક કરે છે. આમાં અનેક રાઉન્ડ ટ્રિપ્સ લાગે છે.
જો તમે આ એકવાર કરો છો, તો ખર્ચ ઓછો છે. જો તમે 40,000 પ્રોડક્ટ્સના લૂપમાં આ કરો છો, તો તમારે તે ખર્ચ 40,000 વખત ચૂકવવો પડે છે. વાસ્તવિક ડેટા નાનો છે, પરંતુ સેટઅપ એ મોંઘો ભાગ છે.
PHP માં ઘણીવાર એવું લાગે છે કે તમારે ક્લાયન્ટ બનાવવો જોઈએ અને પછી તેને કાઢી નાખવો જોઈએ. આ એક સિંગલ વેબ રિક્વેસ્ટ માટે કામ કરે છે, પરંતુ લાંબા સમય સુધી ચાલતી પ્રક્રિયાઓ (long-running processes) માં તે નિષ્ફળ જાય છે.
ક્રોન જોબ્સ (cron jobs), કન્સોલ કમાન્ડ્સ અથવા મેસેજ ક્યૂ કન્ઝ્યુમર્સમાં આ પેટર્ન ટાળો:
- 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 માં, તેને મેન્યુઅલી બનાવવાને બદલે તમારા કન્સ્ટ્રક્ટર દ્વારા કન્ફિગર કરેલ ક્લાયન્ટ ઇન્જેક્ટ કરો.
આવું ન કરવાથી માત્ર લેટન્સી (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
