চূড়ান্ত প্রজেক্ট: একটি মাল্টিথ্রেডেড ওয়েব সার্ভার তৈরি
এটি একটি দীর্ঘ যাত্রা ছিল, কিন্তু আমরা বইয়ের একদম শেষে চলে এসেছি। এই অধ্যায়ে আমরা একসঙ্গে আরও একটি প্রজেক্ট তৈরি করব। এর মাধ্যমে আমরা শেষ কয়েকটি অধ্যায়ে শেখা কিছু ধারণা বাস্তবে প্রয়োগ করে দেখব এবং আগের কিছু পাঠ ঝালিয়ে নেব।
আমাদের চূড়ান্ত প্রজেক্ট হিসেবে, আমরা এমন একটি ওয়েব সার্ভার তৈরি করব যা ওয়েব ব্রাউজারে “hello” দেখাবে, অনেকটা চিত্র ২১-১ এর মতো।
ওয়েব সার্ভারটি তৈরির জন্য আমাদের পরিকল্পনা নিচে দেওয়া হলো:
- TCP এবং HTTP সম্পর্কে কিছুটা জানা।
- একটি socket-এ TCP connection-এর জন্য লিসেন করা।
- অল্প সংখ্যক HTTP request পার্স করা।
- একটি সঠিক HTTP response তৈরি করা।
- একটি thread pool ব্যবহার করে আমাদের server-এর throughput উন্নত করা।
চিত্র ২১-১: আমাদের চূড়ান্ত যৌথ প্রজেক্ট
শুরু করার আগে, দুটি বিষয় উল্লেখ করা জরুরি। প্রথমত, আমরা এখানে যে পদ্ধতিটি ব্যবহার করব, সেটি Rust দিয়ে ওয়েব সার্ভার তৈরি করার সেরা উপায় নয়। কমিউনিটির সদস্যরা crates.io তে এমন অনেক production-ready crate প্রকাশ করেছেন, যেগুলোতে আমাদের তৈরির চেয়েও অনেক বেশি পূর্ণাঙ্গ ওয়েব সার্ভার এবং থ্রেড পুল ইমপ্লিমেন্টেশন রয়েছে। তবে, এই অধ্যায়ে আমাদের উদ্দেশ্য হলো আপনাকে শেখানো, সহজ রাস্তা বেছে নেওয়া নয়। যেহেতু Rust একটি সিস্টেমস প্রোগ্রামিং ল্যাঙ্গুয়েজ, তাই আমরা কোন লেভেলের অ্যাবস্ট্র্যাকশনে কাজ করতে চাই তা বেছে নিতে পারি এবং অন্য অনেক ল্যাঙ্গুয়েজের তুলনায় নিম্ন স্তরে যেতে পারি, যা অন্য ল্যাঙ্গুয়েজে সম্ভব বা বাস্তবসম্মত নয়।
দ্বিতীয়ত, আমরা এখানে async
এবং await
ব্যবহার করব না। একটি async runtime
তৈরির মতো জটিলতা যুক্ত না করেও, একটি thread pool
তৈরি করাই যথেষ্ট বড় একটি চ্যালেঞ্জ। তবে, এই অধ্যায়ে আমরা যে সমস্যাগুলো দেখব, তার কয়েকটির সমাধানে async
এবং await
কীভাবে ব্যবহার করা যেতে পারে, সে সম্পর্কে আমরা আলোকপাত করব। শেষ পর্যন্ত, যেমনটা আমরা ১৭তম অধ্যায়ে দেখেছিলাম, অনেক async runtime
তাদের কাজ পরিচালনার জন্য thread pool
ব্যবহার করে।
এজন্য আমরা বেসিক HTTP server এবং thread pool ম্যানুয়ালি লিখব, যাতে আপনি ভবিষ্যতে ব্যবহার করতে পারেন এমন crate গুলোর পেছনের সাধারণ ধারণা এবং কৌশলগুলো শিখতে পারেন।