يعرف الأصدقاء الذين يستخدمون Nodejs أن العقدة ذات الخيوط الواحدة ، مما يعني أنه عند التشغيل على وحدة المعالجة المركزية المكونة من 8 نور ، يمكنك فقط استخدام قوة الحوسبة الخاصة بواحد واحد.
كان الخيوط الفردية دائمًا نقدًا للعقد ، ولكن مع إدخال الكتلة في الإصدار 0.6 ، تغير هذا الموقف. يمكن للمطورين الاعتماد على Cluster لتوسيع خادم العقدة الخاص بهم بسهولة إلى خادم متعدد الخيوط.
ما هي الكتلة
Cluster هي مكتبة متعددة الخيوط تقدمها العقدة. يمكن للمستخدمين استخدامه لإنشاء مؤشرات ترابط متعددة. المواضيع تشترك في منفذ الاستماع. عندما يكون هناك طلب خارجي لهذا المنفذ ، ستقوم Cluster بإعادة توجيه الطلب إلى مؤشر ترابط عشوائي. نظرًا لأن كل مؤشر ترابط العقدة سيشغل عشرات من الذاكرة الضخمة ، فمن المستحيل إنشاء مؤشر ترابط لكل طلب مثل PHP. بشكل عام ، لن يتجاوز عدد المواضيع التي تم إنشاؤها عدد نوى وحدة المعالجة المركزية على الأكثر.
نسخة الكود كما يلي:
var cluster = require ('cluster') ؛
var http = require ('http') ؛
var numCpus = require ('OS'). cpus (). الطول ؛
if (cluster.ismaster) {
// شوكة العمال.
لـ (var i = 0 ؛ i <numcpus ؛ i ++) {
cluster.fork () ؛
}
cluster.on ('exit' ، function (عامل ، رمز ، إشارة) {
console.log ('worker' + worker.process.pid + 'die') ؛
}) ؛
} آخر {
// يمكن للعمال مشاركة أي اتصال TCP
// في هذه الحالة ، يكون خادم HTTP
http.createserver (وظيفة (req ، الدقة) {
Res.Writehead (200) ؛
res.end ("Hello World/N") ؛
}). الاستماع (8000) ؛
}
كما هو موضح في الكود أعلاه ، سيتم ضبط cluster.ismaster على صحيح عند تشغيل البرنامج. بعد استدعاء cluster.fork () ، سيقوم البرنامج بإنشاء مؤشر ترابط وإعادة تشغيله. في هذا الوقت ، سيتم ضبط cluster.ismaster على خطأ. نستخدم هذا المتغير بشكل أساسي لتحديد ما إذا كان الخيط الحالي ينتمي إلى مؤشر ترابط طفل.
تجدر الإشارة أيضًا إلى أنه بعد إنشاء كل خيط طفل ، سيستمع إلى المنفذ 8000 دون التسبب في تعارضات. هذه هي وظيفة المنافذ المشتركة للكتلة.
التواصل بين المواضيع
عند إنشاء مؤشرات الترابط ، فإنها لا تشارك الذاكرة أو البيانات مع بعضها البعض. لا يمكن معالجة جميع تبادل البيانات إلا في مؤشر الترابط الرئيسي من خلال العامل. ما يلي يسرد مثالا على نظام البث.
نسخة الكود كما يلي:
var cluster = require ('cluster') ؛
var http = require ('http') ؛
var numCpus = require ('OS'). cpus (). الطول ؛
if (cluster.ismaster) {
var العمال = [] ؛
// إنشاء عامل جديد
وظيفة NewWorker () {
var worker = cluster.fork () ؛
// استمع إلى المعلومات. إذا تم بث النوع ، فسيتم تحديده كبث
العامل. ('رسالة' ، وظيفة (msg) {
if (msg.type == 'Broadcast') {
var event = msg.event ؛
// أرسل هذا البث إلى جميع العمال
العمال. for (وظيفة (عامل) {
عامل.
})
}
}) ؛
العامل المرجع
}
لـ (var i = 0 ؛ i <numcpus ؛ i ++) {
العمال.
}
cluster.on ('Online' ، وظيفة (عامل) {
console.log ('Worker ٪ d Is Online' ، worker.id) ؛
})
} آخر {
var عامل = cluster.worker ؛
// البث هو إرسال رسالة مع إذاعة النوع ، الحدث هو محتوى البث
worker.broadcast = function (event) {
العامل ({
النوع: "البث" ،
الحدث: الحدث
}) ؛
}
// لا يمكن الاستماع إلى المعلومات التي تم إرجاعها باستخدام Worker.on هنا.
Process.on ('message' ، function (event) {
console.log ('Worker:'+worker.id+'reveded event from'+event.workerid) ؛
})
// إرسال البث
Worker.Broadcast ({
الرسالة: "عبر الإنترنت" ،
عامل: عامل
})
}
قضايا يجب أن تكون على دراية بها
وذكر أعلاه أيضًا أنه لا يمكن مشاركة البيانات بين مؤشرات الترابط ، ولا يمكن تبادل جميع عمليات تبادل البيانات إلا من خلال التواصل بين مؤشرات الترابط. علاوة على ذلك ، لا يمكن تمرير البيانات المتبادلة ، لذلك لا يمكن تمرير الوظائف ، وواصفات الملفات ، و HTTPRESPER.
إذا كنت تستخدم Cluster ، فأنت بحاجة إلى النظر في مشكلة تبادل البيانات عند تصميم البرنامج. تتمثل مقاربي الخاصة في تخزين جميع البيانات المشابهة للجلسة الموجودة في Redis ، ويقوم كل مؤشر ترابط بعمل التخزين والسحب ، وكل البيانات لا يتم وضعها في ذاكرة العقدة.
النقطة الأخيرة ، يتم تمييز CLUSTER حاليًا رسميًا على أنها تجريبية بواسطة العقدة ، وقد تتغير واجهة برمجة التطبيقات في المستقبل.