হ্যান্ডশেক ট্যাক্স
আপনার Magento ইন্টিগ্রেশন একটি লুকানো নেটওয়ার্ক খরচের কারণে ধীরগতির হতে পারে।
আমি একবার একটি প্রোডাক্ট এক্সপোর্ট চালিয়েছিলাম যা একটি প্রাইসিং API-এর সাথে যোগাযোগ করছিল। একটি প্রোডাক্ট খুব দ্রুত কাজ করেছিল। কিন্তু পুরো ক্যাটালগটি শেষ হতে অনেক সময় লেগেছিল। আমার ডাটাবেস তখন অলস (idle) অবস্থায় ছিল। প্রোফাইলার থেকে দেখা গেল সমস্যাটি ছিল নেটওয়ার্কে।
কোডটি একটি লুপের ভেতরে নতুন একটি HTTP ক্লায়েন্ট তৈরি করছিল।
HTTPS-এর মাধ্যমে ডেটা পাঠানোর আগে আপনার মেশিনকে অনেক কাজ করতে হয়। একটি সকেট খোলার জন্য এটি একটি TCP হ্যান্ডশেক সম্পন্ন করে। তারপর সার্টিফিকেট বিনিময় এবং কী (key) আলোচনার জন্য এটি একটি TLS হ্যান্ডশেক সম্পন্ন করে। এতে বেশ কয়েকবার রাউন্ড ট্রিপ (round trips) প্রয়োজন হয়।
আপনি যদি এটি একবার করেন, তবে খরচ কম। কিন্তু আপনি যদি ৪০,০০০ প্রোডাক্টের একটি লুপের ভেতরে এটি করেন, তবে আপনাকে সেই খরচ ৪০,০০০ বার দিতে হবে। আসল ডেটা খুব ছোট। কিন্তু সেটআপ করার অংশটিই সবচেয়ে ব্যয়বহুল।
PHP ব্যবহার করার সময় প্রায়ই মনে হয় যে একটি ক্লায়েন্ট তৈরি করে কাজ শেষে তা ফেলে দেওয়া উচিত। একটি সিঙ্গেল ওয়েব রিকোয়েস্টের জন্য এটি কাজ করলেও, দীর্ঘক্ষণ চলা প্রসেসগুলোর (long-running processes) ক্ষেত্রে এটি ব্যর্থ হয়।
ক্রন জব (cron jobs), কনসোল কমান্ড বা মেসেজ কিউ কনজিউমারগুলোতে (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) মাধ্যমে একটি কনফিগার করা ক্লায়েন্ট ইনজেক্ট করুন।
এটি করতে ব্যর্থ হলে শুধু ল্যাটেন্সি (latency) বা ধীরগতিই নয়, আরও সমস্যা হতে পারে। আপনার আউটবাউন্ড পোর্ট (outbound ports) শেষ হয়ে যেতে পারে। বন্ধ হওয়া কানেকশনগুলো TIME_WAIT অবস্থায় আপনার ওএস (OS) সেগুলো রিক্লেম করার আগেই স্তূপাকার হতে থাকে। ফলে আপনার সার্ভিসটি নতুন সকেট খোলা পুরোপুরি বন্ধ করে দেবে।
আপনার কোডে এই ভুলটি আছে কিনা তা পরীক্ষা করুন। আপনার টার্মিনালে এই কমান্ডটি চালান:
grep -rn "new .*Client(" app/code | grep -i http
লুপের ভেতরে কোনো নতুন ক্লায়েন্ট তৈরি করা হচ্ছে কিনা তা দেখুন। ক্লায়েন্টটিকে লুপের বাইরে নিয়ে আসুন। এটি মাত্র এক লাইনের একটি পরিবর্তন যা বড় আকারের সিঙ্ক (sync) করার ক্ষেত্রে বিশাল গতি বৃদ্ধি করবে।
Source: https://dev.to/iamrobindhiman/the-handshake-tax-reuse-your-http-client-in-magento-integrations-3kk7
