HeadlinesBriefing HeadlinesBriefing.com

Go-তে উন্নত HTTP/1 সংযোগ পুনঃব্যবহার

Hacker News •
×

এই ফাংশনটি বিবেচনা করুন, যা একটি URL-এ GET অনুরোধ পাঠায় এবং HTTP স্ট্যাটাস কোড ফেরত দেয়। HTTP/1 (GODEBUG=http2client=0) ব্যবহার করে, লেখকের মেশিনে Go 1.26-এ index.golang.org-এর বিরুদ্ধে এটি ১০০ বার কল করতে প্রায় ৭১০ মিলিসেকেন্ড লাগে। Go 1.27-এ একই প্রোগ্রাম প্রায় ১৫০ মিলিসেকেন্ডে চলে, যা প্রায় ৫ গুণ দ্রুত।

এই পার্থক্য আসে নতুন সংযোগ স্থাপনের খরচ থেকে। নতুন সংযোগের মাধ্যমে অনুরোধ পাঠাতে একটি TCP হ্যান্ডশেক (১ রাউন্ড-ট্রিপ টাইম, বা RTT), একটি TLS হ্যান্ডশেক (TLS 1.2-এ ২ RTT) এবং তারপর HTTP অনুরোধ নিজেই লাগে, অর্থাৎ মোট প্রায় ৩ RTT। আঞ্চলিক যোগাযোগে একমুখী বিলম্ব প্রায়ই ৫০ ms বা তার বেশি হয়, তাই শুধু সেটআপেই প্রায় ৩০০ ms লাগতে পারে। index.golang.org-এর ক্ষেত্রেও, যা TLS 1.3 ব্যবহার করে এবং তুলনামূলক কম বিলম্ব দেয়, নতুন সংযোগ খোলা এখনও বেশ লক্ষণীয়।

এই খরচ এড়াতে HTTP ক্লায়েন্ট ও সার্ভার সংযোগ পুনঃব্যবহারের চেষ্টা করে। HTTP/1.0 ক্লায়েন্ট ও সার্ভার Connection: keep-alive হেডার দিয়ে এতে সম্মতি জানায়, অন্যদিকে HTTP/1.1 সংযোগ ডিফল্টভাবে স্থায়ী। HTTP/2 একটি একক TCP সংযোগের উপর একাধিক অনুরোধ ও প্রতিক্রিয়া মাল্টিপ্লেক্স করে।

তবে HTTP/1-এ পুনঃব্যবহার ব্যর্থ হতে পারে। একই সংযোগে প্রতিক্রিয়াগুলো ক্রমানুসারে পাঠানো হয়, তাই net/http বর্তমান প্রতিক্রিয়ার বডি শেষ পর্যন্ত পড়ার পরই পরবর্তী প্রতিক্রিয়ার শুরু খুঁজে পেতে পারে। উদাহরণে প্রতিক্রিয়ার বডি কখনও পড়া হয় না, তাই resp.Body.Close কল করা হলে net/http একটি অপঠিত বডি পায় এবং সংযোগটি নিরাপদে পুনঃব্যবহার করতে পারে না। Go 1.26 পর্যন্ত, এর অর্থ ছিল প্রতিটি অনুরোধের জন্য একটি নতুন সংযোগ।

উৎস: Hacker News · সারাংশ: HeadlinesBriefing