ہینڈ شیک ٹیکس
آپ کی Magento انٹیگریشن ایک چھپے ہوئے نیٹ ورک خرچ (network cost) کی وجہ سے سست ہو سکتی ہے۔
ایک بار میں نے پروڈکٹ ایکسپورٹ کا ایک عمل چلایا جو پرائسنگ API سے رابطہ کر رہا تھا۔ ایک پروڈکٹ تیزی سے کام کر گئی۔ پورا کیٹلاگ مکمل ہونے میں بہت زیادہ وقت لگا۔ میرا ڈیٹا بیس خالی (idle) بیٹھا تھا۔ پروفائلر (profiler) نے دکھایا کہ مسئلہ نیٹ ورک کا تھا۔
کوڈ ایک لوپ (loop) کے اندر نیا HTTP کلائنٹ بنا رہا تھا۔
HTTPS کے ذریعے ڈیٹا بھیجنے سے پہلے، آپ کی مشین کو بھاری کام کرنا پڑتا ہے۔ یہ ساکٹ (socket) کھولنے کے لیے TCP ہینڈ شیک (handshake) کرتا ہے۔ پھر یہ سرٹیفکیٹس کے تبادلے اور کیز (keys) کے لیے TLS ہینڈ شیک کرتا ہے۔ اس میں کئی راؤنڈ ٹرپس (round trips) درکار ہوتے ہیں۔
اگر آپ یہ ایک بار کرتے ہیں، تو خرچہ کم ہے۔ لیکن اگر آپ اسے 40,000 پروڈکٹس کے لوپ کے اندر کرتے ہیں، تو آپ کو یہ خرچہ 40,000 بار ادا کرنا پڑتا ہے۔ اصل ڈیٹا چھوٹا ہوتا ہے، لیکن سیٹ اپ (setup) مہنگا حصہ ہے۔
PHP میں اکثر ایسا محسوس ہوتا ہے کہ آپ کو ایک کلائنٹ بنانا چاہیے اور پھر اسے ختم کر دینا چاہیے۔ یہ ایک سنگل ویب ریکویسٹ کے لیے تو ٹھیک ہے، لیکن طویل عرصے تک چلنے والے پروسیسز (long-running processes) میں یہ ناکام ہو جاتا ہے۔
کرون جابز (cron jobs)، کنسول کمانڈز، یا میسج کیو کنزیومرز (message queue consumers) میں اس پیٹرن سے بچیں:
- foreach ($products as $product) {
- $client = new \GuzzleHttp\Client();
- $client->post('https://api.example.com/sync', [...]);
- }
یہ کوڈ ہر ایک پروڈکٹ کے لیے ایک نیا کنکشن کھولتا ہے اور مکمل ہینڈ شیک کرتا ہے۔
اگر آپ ایک ہی کلائنٹ انسٹنس (instance) استعمال کریں تو 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) بھی ختم ہو سکتے ہیں۔ بند شدہ کنکشنز 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
