المشروع النهائي: بناء خادم ويب متعدد الخيوط (Multithreaded)
لقد كانت رحلة طويلة، ولكننا وصلنا إلى نهاية الكتاب. في هذا الفصل، سنقوم ببناء مشروع إضافي معًا لعرض بعض المفاهيم التي تناولناها في الفصول الأخيرة، بالإضافة إلى استعراض بعض الدروس السابقة.
في مشروعنا النهائي، سننشئ خادم ويب يعرض رسالة “مرحبًا!” ويبدو كما هو موضح في الشكل 21-1 في متصفح الويب.
إليك خطتنا لبناء خادم الويب:
- التعرف على بروتوكولات TCP و HTTP.
- الاستماع إلى اتصالات TCP على الـ socket.
- تحليل عدد صغير من طلبات HTTP.
- إنشاء استجابة HTTP صحيحة.
- تحسين معدل النقل/الإنتاجية (Throughput) لخادمنا بواسطة تجمع الخيوط (Thread Pool).
الشكل 21-1: مشروعنا النهائي المشترك
قبل أن نبدأ، يجب أن نذكر نقطتين. أولاً، الطريقة التي سنستخدمها لن تكون أفضل طريقة لبناء خادم ويب باستخدام Rust. فقد نشر أعضاء المجتمع عددًا من الحزم (crates) الجاهزة للاستخدام الإنتاجي والمتوفرة على crates.io والتي تقدم تنفيذات أكثر شمولاً لخوادم الويب وتجمعات الخيوط من تلك التي سنبنيها. ولكن هدفنا في هذا الفصل هو مساعدتك على التعلم، وليس اتباع الطريق الأسهل. وبما أن Rust هي لغة برمجة أنظمة (Systems Programming Language)، يمكننا اختيار مستوى التجريد الذي نريد العمل به ويمكننا النزول إلى مستوى أدنى مما هو ممكن أو عملي في لغات أخرى.
ثانيًا، لن نستخدم هنا مفاهيمي async و await. بناء تجمع الخيوط (Thread Pool) هو تحدٍ كبير بذاته، بدون أن نضيف بناء بيئة تشغيل غير متزامنة (async runtime)! ومع ذلك، سنشير إلى كيف يمكن أن يكون async و await ذا تطبيق لبعض نفس المشاكل التي سنراها في هذا الفصل. في النهاية، كما ذكرنا في الفصل 17، كثير من بيئات التشغيل غير المتزامنة تستخدم تجمعات الخيوط لإدارة أعمالها.
لذلك، سنقوم بكتابة خادم HTTP الأساسي وتجمع الخيوط يدويًا بحيث تتمكن من التعرف على الأفكار والتقنيات العامة وراء الحزم التي قد تستخدمها في المستقبل.