Kodi ya Handshake

Uunganishaji wako wa Magento unaweza kuwa wa polepole kwa sababu ya gharama ya siri ya mtandao.

Wakati mmoja nilifanya uuzaji wa bidhaa (product export) uliokuwa unawasiliana na API ya bei. Bidhaa moja ilifanya kazi haraka. Katalogi nzima ilichukua muda mrefu sana. Kanzi data (database) yangu ilikuwa haifanyi kazi. Profiler ilionyesha kuwa tatizo lilikuwa mtandao.

Kanuni (code) ilitengeneza HTTP client mpya ndani ya loop.

Kabla ya kutuma data kupitia HTTPS, mashine yako inafanya kazi nzito. Inafanya TCP handshake ili kufungua socket. Kisha inafanya TLS handshake ili kubadilishana vyeti (certificates) na kukubaliana juu ya funguo (keys). Hii inachukua mizunguko kadhaa (round trips).

Ukifanya hivi mara moja, gharama ni ndogo. Ukifanya hivi ndani ya loop ya bidhaa 40,000, unalipa gharama hiyo mara 40,000. Data halisi ni ndogo. Maandalizi (setup) ndiyo sehemu ghali zaidi.

PHP mara nyingi inahisi kana kwamba unapaswa kutengeneza client na kuitupa. Hii inafanya kazi kwa ombi moja la wavuti (single web request). Inafeli katika michakato inayodumu kwa muda mrefu (long-running processes).

Epuka mfumo huu katika cron jobs, amri za konsoli (console commands), au watumiaji wa foleni za ujumbe (message queue consumers):

Kanuni hii inafungua muunganisho mpya na kufanya handshake kamili kwa kila bidhaa moja moja.

Guzzle huweka miunganisho hai ikiwa unatumia client instance ile ile. Hamisha client nje ya loop yako:

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

Sasa socket na TLS session vinabaki wazi. Unafanya handshake mara moja na kusambaza (stream) mengine yote. Katika Magento, ingiza (inject) client iliyosanifiwa kupitia constructor yako badala ya kuitengeneza mwenyewe.

Kushindwa kufanya hivi husababisha zaidi ya ucheleweshaji (latency) tu. Unaweza kuishiwa na outbound ports. Miunganisho iliyofungwa hujikusanya katika TIME_WAIT kwa kasi zaidi kuliko OS yako inavyoichukua tena. Huduma yako itaacha kabisa kufungua sockets mpya.

Kagua kanuni yako kwa kosa hili. Run amri hii kwenye terminal yako:

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

Tafuta uundaji wowote wa client mpya uliopo ndani ya loop. Hamisha client nje ya loop. Ni mabadiliko ya mstari mmoja tu ambayo yanatoa kasi kubwa kwa usawazishaji (syncs) mkubwa.

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