هناك نمط تصميم معروف جدًا في الباكاند (backend communication design patterns)، نستخدمه كل يوم كمطورين دون أن نعلم ذلك،، هذا النمط هو: Multiplexing / Demultiplexing.
هذا المفهوم يُستخدم في عالم الشبكات (Computer Networks)،، لكن له أهمية كبيرة في فهمك لتصميم و برمجة التطبيقات كمطور ويب أو مهندس برمجيات.
لنذهب مباشرة إلى التفاصيل:
المالتيبلاكسين،، هو دمج لعدة requests من تطبيقات او resources مختلقة.. يتم تجميعها و ارسالها عبر قناة اتصال واحدة.
الديمالتيبلاكسين،، هو العكس تماما،، ال requests المجمعة او المدمجة، يتم. تفكيكها و توصيلها الى التطبيق، ال port او الجهة المستهدفة من ال server.
لماذا هذا design pattern مهم، ولماذا يجب أن تفهمه كمطور ويب؟
عندما يعمل جهازك على تشغيل العديد من التطبيقات في نفس الوقت (مثل المتصفح، البريد الإلكتروني، FTP)، كل هذه التطبيقات ترسل وتستقبل البيانات عبر اتصال إنترنت واحد فقط و الكتصلح هو الذي يقوم بال requests في هذه الحالة، بناءا على ما شرحناها فوق في بداية المنشور.
ال Multiplexing يضمن أن جميع البيانات من التطبيقات المختلفة يتم إرسالها عبر نفس قناة الشبكة.
ال Demultiplexing يضمن عند وصول هذه البيانات، أن يتم توصيلها إلى التطبيق او ال port الصحيح.
مثال عملي باستخدام PHP:
تخيل أنك تملك سكربت واحد يستقبل جميع الطلبات (مثل Multiplexer)، وبناءً على باراميتر (parameter) معين في الطلب،، يقوم بتوجيه (Demultiplexing) البيانات إلى المعالج المناسب:
<?php
// Demultiplexer
if (isset($_GET['service'])) {
$service = $_GET['service'];
switch ($service) {
case 'weather':
echo getWeather();
break;
case 'news':
echo getNews();
break;
case 'time':
echo getTime();
break;
default:
echo "Service not found.";
}
} else {
echo "No service requested.";
}
function getWeather() {
return "Today's weather is sunny.";
}
function getNews() {
return "Latest news: PHP is still awesome!";
}
function getTime() {
return "Current server time: " . date('H:i:s');
}
?>
شرح المثال:
الباراميتر $_GET['service'] يشبه رقم المنفذ (port number).
عملية Multiplexing تحدث عندما ترسل طلبات تحمل قيم مختلفة لهذا الباراميتر.
السكربت يقوم بعملية Demultiplexing حيث يستقبل الطلب، ويفصله ويوجهه إلى الدالة الصحيحة بناءً على الخدمة المطلوبة.
مثال حقيقي آخر من الحياة البرمجية: API Gateway
في كثير من المشاريع، يكون لديك API Gateway واحد (واجهة استقبال واحدة لكل الطلبات)، وهو يستقبل كل الطلبات من المستخدمين (Multiplexing)، ثم بناءً على مسار (route) أو باراميتر معين، يقوم بتوجيه الطلب إلى الخدمة المناسبة (Demultiplexing).
تخيل هذا السيناريو:
لديك تطبيق ويب يقدّم عدة خدمات:
- /api/user - to get users
- /api/orders - to get order list
- /api/products - to get products list
لكن بدلاً من عمل 3 ملفات منفصلة، لديك ملف واحد اسمه api.php أو route.php يقوم بكل شيء:
مثال توضيحي:
<?php
$requestUri = $_SERVER['REQUEST_URI'];
// Multiplexing: all requests comes to this file using one URI
if (strpos($requestUri, '/api/user') !== false) {
echo getUserInfo();
} elseif (strpos($requestUri, '/api/orders') !== false) {
echo getOrders();
} elseif (strpos($requestUri, '/api/products') !== false) {
echo getProducts();
} else {
echo json_encode(['error' => 'Endpoint not found']);
}
// Demultiplexing: here we redirect the users based on request type.
function getUserInfo() {
...
}
function getOrders() {
...
}
function getProducts() {
...
}
?>
إذا؛
- جميع الطلبات (user, orders, products) تمر عبر قناة واحدة api.php أو route.php،، هذا بالظبط هو ال Multiplexing.
- بداخل السكربت، يتم التحقق من REQUEST_URI وتوجيه الطلب إلى ال function المناسبة،، هذا هو Demultiplexing.
>>Click here to continue<<