ഹാൻഡ്‌ഷേക്ക് ടാക്സ്

നിങ്ങളുടെ Magento ഇന്റഗ്രേഷൻ ഒരു മറഞ്ഞിരിക്കുന്ന നെറ്റ്‌വർക്ക് ചെലവ് (network cost) കാരണം സാവധാനത്തിലായേക്കാം.

ഒരിക്കൽ ഒരു പ്രൈസിംഗ് API-യുമായി ബന്ധപ്പെട്ട ഒരു പ്രൊഡക്റ്റ് എക്സ്പോർട്ട് (product export) ഞാൻ നടത്തിയിരുന്നു. ഒരു പ്രൊഡക്റ്റ് വളരെ വേഗത്തിൽ പ്രവർത്തിച്ചു. എന്നാൽ മുഴുവൻ കാറ്റലോഗും പൂർത്തിയാക്കാൻ ഒരുപാട് സമയമെടുത്തു. എന്റെ ഡാറ്റാബേസ് വെറുതെ ഇരിക്കുകയായിരുന്നു (idle). പ്രശ്നം നെറ്റ്‌വർക്ക് ആണെന്ന് പ്രൊഫൈലർ (profiler) കാണിച്ചുതന്നു.

കോഡിനുള്ളിലെ ഒരു ലൂപ്പിനുള്ളിൽ (loop) പുതിയൊരു HTTP ക്ലയന്റ് (HTTP client) നിർമ്മിക്കുകയായിരുന്നു പ്രശ്നം.

HTTPS വഴി ഡാറ്റ അയക്കുന്നതിന് മുമ്പ്, നിങ്ങളുടെ മെഷീൻ കഠിനമായ ജോലികൾ ചെയ്യുന്നുണ്ട്. ഒരു സോക്കറ്റ് (socket) തുറക്കുന്നതിനായി ഇത് ഒരു TCP ഹാൻഡ്‌ഷേക്ക് (TCP handshake) നടത്തുന്നു. തുടർന്ന് സർട്ടിഫിക്കറ്റുകൾ കൈമാറുന്നതിനും കീകൾ (keys) ക്രമീകരിക്കുന്നതിനുമായി ഒരു TLS ഹാൻഡ്‌ഷേക്ക് നടത്തുന്നു. ഇതിനായി പലതവണ ഡാറ്റാ കൈമാറ്റങ്ങൾ (round trips) ആവശ്യമാണ്.

ഇത് ഒരു തവണ മാത്രം ചെയ്യുകയാണെങ്കിൽ ചെലവ് കുറവാണ്. എന്നാൽ 40,000 പ്രൊഡക്റ്റുകളുള്ള ഒരു ലൂപ്പിനുള്ളിൽ ഇത് ചെയ്യുകയാണെങ്കിൽ, നിങ്ങൾ ആ ചെലവ് 40,000 തവണ നൽകേണ്ടി വരും. യഥാർത്ഥ ഡാറ്റ വളരെ ചെറുതാണ്, എന്നാൽ ഈ സെറ്റപ്പ് (setup) ആണ് ഏറ്റവും കൂടുതൽ സമയം എടുക്കുന്നത്.

ഒരു ക്ലയന്റ് നിർമ്മിച്ച ശേഷം അത് ഉപയോഗിച്ച് അവസാനിപ്പിക്കാം എന്ന് പലപ്പോഴും PHP ഉപയോഗിക്കുമ്പോൾ തോന്നും. ഒരു സിംഗിൾ വെബ് റിക്വസ്റ്റിന് (single web request) ഇത് പ്രവർത്തിക്കും. എന്നാൽ ദീർഘനേരം നീണ്ടുനിൽക്കുന്ന പ്രക്രിയകളിൽ (long-running processes) ഇത് പരാജയപ്പെടും.

ക്രോൺ ജോബുകളിലോ (cron jobs), കൺസോൾ കമാൻഡുകളിലോ (console commands), മെസ്സേജ് ക്യൂ കൺസ്യൂമറുകളിലോ (message queue consumers) ഈ രീതി ഒഴിവാക്കുക:

ഈ കോഡ് ഓരോ പ്രൊഡക്റ്റിനും പുതിയൊരു കണക്ഷൻ തുറക്കുകയും മുഴുവൻ ഹാൻഡ്‌ഷേക്കും നടത്തുകയും ചെയ്യുന്നു.

ഒരേ ക്ലയന്റ് ഇൻസ്റ്റൻസ് (client instance) ഉപയോഗിക്കുകയാണെങ്കിൽ Guzzle കണക്ഷനുകൾ നിലനിർത്തും. ക്ലയന്റിനെ ലൂപ്പിന് പുറത്തേക്ക് മാറ്റുക:

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

ഇപ്പോൾ സോക്കറ്റും TLS സെഷനും തുറന്നുതന്നെയിരിക്കും. നിങ്ങൾ ഒരു തവണ മാത്രം ഹാൻഡ്‌ഷേക്ക് നടത്തുകയും ബാക്കി ഡാറ്റാ സ്ട്രീം ചെയ്യുകയും ചെയ്യുന്നു. Magento-യിൽ, ഒരു ക്ലയന്റ് മാനുവലായി നിർമ്മിക്കുന്നതിന് പകരം കൺസ്ട്രക്റ്ററിലൂടെ (constructor) കോൺഫിഗർ ചെയ്ത ഒരു ക്ലയന്റ് ഇൻജക്റ്റ് (inject) ചെയ്യുക.

ഇത് ചെയ്യാതിരിക്കുന്നത് ലേറ്റൻസി (latency) ഉണ്ടാക്കുന്നതിലുപരി മറ്റ് പ്രശ്നങ്ങൾക്കും കാരണമാകും. ഔട്ട്‌ബൗണ്ട് പോർട്ടുകൾ (outbound ports) തീർന്നുപോയേക്കാം. ക്ലോസ് ചെയ്ത കണക്ഷനുകൾ നിങ്ങളുടെ ഓപ്പറേറ്റിംഗ് സിസ്റ്റം തിരിച്ചുപിടിക്കുന്നതിനേക്കാൾ വേഗത്തിൽ 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