"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > معالجة فعالة للبيانات باستخدام تدفقات Node.js

معالجة فعالة للبيانات باستخدام تدفقات Node.js

تم النشر بتاريخ 2024-11-09
تصفح:462

Efficient Data Handling with Node.js Streams

في هذه المقالة، سنتعمق في Node.js Streams ونفهم كيف تساعد في معالجة كميات كبيرة من البيانات بكفاءة. توفر التدفقات طريقة أنيقة للتعامل مع مجموعات البيانات الكبيرة، مثل قراءة الملفات الكبيرة أو نقل البيانات عبر الشبكة أو معالجة المعلومات في الوقت الفعلي. على عكس عمليات الإدخال/الإخراج التقليدية التي تقرأ أو تكتب البيانات بالكامل مرة واحدة، تقوم التدفقات بتقسيم البيانات إلى أجزاء يمكن التحكم فيها ومعالجتها قطعة قطعة، مما يسمح باستخدام الذاكرة بكفاءة.

في هذا المقال سنتناول:

  1. ما هي مجاري Node.js؟
  2. أنواع مختلفة من التدفقات في Node.js.
  3. كيفية إنشاء واستخدام التدفقات.
  4. حالات الاستخدام الواقعية للتدفقات.
  5. مزايا استخدام التدفقات.

ما هي تدفقات Node.js؟

التدفق في Node.js هو تدفق مستمر للبيانات. تعتبر التدفقات مفيدة بشكل خاص للتعامل مع المهام المرتبطة بالإدخال/الإخراج، مثل قراءة الملفات، أو الاتصال عبر الشبكة، أو التفاعل مع قواعد البيانات. بدلاً من انتظار اكتمال العملية بأكملها، تتيح التدفقات إمكانية معالجة البيانات في أجزاء.

الميزات الرئيسية للتدفقات:

  • معتمد على الأحداث: يتم إنشاء التدفقات على أعلى بنية Node.js المستندة إلى الأحداث، والتي تسمح بمعالجة البيانات بمجرد توفرها.
  • كفاءة الذاكرة: تقوم التدفقات بتقسيم البيانات إلى أجزاء ومعالجتها قطعة قطعة، مما يقلل من حمل الذاكرة على نظامك.
  • غير محظور: يمكن لتدفقات Node.js التعامل مع البيانات الكبيرة بشكل غير متزامن دون حظر حلقة الحدث الرئيسية.
أنواع التدفقات في Node.js

يوفر Node.js أربعة أنواع من التدفقات:

  1. تدفقات قابلة للقراءة: التدفقات التي يمكنك قراءة البيانات منها.
  2. التدفقات القابلة للكتابة: التدفقات التي يمكنك كتابة البيانات إليها.
  3. تدفقات مزدوجة: تدفقات قابلة للقراءة والكتابة (على سبيل المثال، مآخذ الشبكة).
  4. تحويل التدفقات: التدفقات التي تقوم بتعديل أو تحويل البيانات أثناء القراءة أو الكتابة (على سبيل المثال، ضغط الملفات أو فك ضغطها).
استخدام تدفقات Node.js

دعونا نستكشف كل نوع من أنواع البث مع الأمثلة.

3.1 تيارات قابلة للقراءة

التدفقات القابلة للقراءة تسمح لك بقراءة البيانات قطعة قطعة، وهو أمر مفيد للتعامل مع الملفات الكبيرة أو مصادر البيانات في الوقت الحقيقي.

const fs = require('fs'); // أنشئ دفقًا قابلاً للقراءة من ملف كبير const readableStream = fs.createReadStream('largeFile.txt', { الترميز: "utf8"، HighWaterMark: 16 * 1024 // 16 كيلو بايت حجم القطعة }); readableStream.on('data', (chunk) => { console.log('تم استلام قطعة جديدة:', Chunk); }); readableStream.on('end', () => { console.log("اكتملت قراءة الملف"); });

const fs = require('fs');

// Create a readable stream from a large file
const readableStream = fs.createReadStream('largeFile.txt', {
    encoding: 'utf8',
    highWaterMark: 16 * 1024 // 16 KB chunk size
});

readableStream.on('data', (chunk) => {
    console.log('New chunk received:', chunk);
});

readableStream.on('end', () => {
    console.log('Reading file completed');
});


    في هذا المثال، تقوم طريقة createReadStream بقراءة الملف في أجزاء بحجم 16 كيلو بايت.
  • تتم معالجة كل قطعة بمجرد توفرها، بدلاً من انتظار تحميل الملف بأكمله في الذاكرة.
  • يشير حدث النهاية إلى اكتمال عملية القراءة.
3.2 التدفقات القابلة للكتابة

يتم استخدام التدفقات القابلة للكتابة لكتابة البيانات بشكل متزايد إلى وجهة ما، مثل ملف أو مقبس شبكة.

const fs = require('fs'); // قم بإنشاء دفق قابل للكتابة لكتابة البيانات إلى ملف const writableStream = fs.createWriteStream('output.txt'); writableStream.write('مرحبا بالعالم!\n'); writableStream.write('كتابة مجموعة البيانات قطعة تلو الأخرى.\n'); // إنهاء الدفق وإغلاق الملف writableStream.end(() => { console.log("اكتملت كتابة الملف"); });

const fs = require('fs');

// Create a readable stream from a large file
const readableStream = fs.createReadStream('largeFile.txt', {
    encoding: 'utf8',
    highWaterMark: 16 * 1024 // 16 KB chunk size
});

readableStream.on('data', (chunk) => {
    console.log('New chunk received:', chunk);
});

readableStream.on('end', () => {
    console.log('Reading file completed');
});


    إرسال البيانات إلى الملف بشكل متزايد.
  • تشير وظيفة النهاية إلى أنه لن تتم كتابة المزيد من البيانات وتغلق الدفق.
3.3 تيارات مزدوجة

يمكن للتيار المزدوج

قراءة البيانات وكتابتها. أحد الأمثلة الشائعة هو مقبس TCP، الذي يمكنه إرسال واستقبال البيانات في وقت واحد. const net = require('net'); // إنشاء دفق مزدوج (خادم صدى بسيط) خادم const = net.createServer((socket) => { المقبس.on('بيانات', (بيانات) => { console.log('تم الاستلام:', data.toString()); // صدى البيانات مرة أخرى إلى العميل المقبس.write(`الصدى: ${data}`); }); المقبس.on('end', () => { console.log("الاتصال مغلق"); }); }); server.listen(8080, () => { console.log("الخادم يستمع على المنفذ 8080"); });


const net = require('net');

// Create a duplex stream (a simple echo server)
const server = net.createServer((socket) => {
    socket.on('data', (data) => {
        console.log('Received:', data.toString());
        // Echo the data back to the client
        socket.write(`Echo: ${data}`);
    });

    socket.on('end', () => {
        console.log('Connection closed');
    });
});

server.listen(8080, () => {
    console.log('Server listening on port 8080');
});


يقوم هذا المثال بإنشاء خادم صدى أساسي يقرأ البيانات الواردة من العميل ويرسلها مرة أخرى.
  • يعد التدفق المزدوج مفيدًا عند الحاجة إلى اتصال ثنائي الاتجاه، كما هو الحال في بروتوكولات الشبكة.
  • 3.4 تحويل التدفقات

أ

تدفق التحويل

هو نوع خاص من التدفق المزدوج الذي يعدل البيانات أثناء مرورها. إحدى حالات الاستخدام الشائعة هي ضغط الملفات. const fs = require('fs'); const zlib = require('zlib'); // قم بإنشاء دفق قابل للقراءة لملف ودفق قابل للكتابة لملف الإخراج const readable = fs.createReadStream('input.txt'); const writable = fs.createWriteStream('input.txt.gz'); // قم بإنشاء دفق تحويل يضغط الملف const gzip = zlib.createGzip(); // قم بتوصيل الدفق القابل للقراءة إلى دفق التحويل، ثم إلى الدفق القابل للكتابة readable.pipe(gzip).pipe(writable); writable.on('finish', () => { console.log("تم ضغط الملف بنجاح"); });


const net = require('net');

// Create a duplex stream (a simple echo server)
const server = net.createServer((socket) => {
    socket.on('data', (data) => {
        console.log('Received:', data.toString());
        // Echo the data back to the client
        socket.write(`Echo: ${data}`);
    });

    socket.on('end', () => {
        console.log('Connection closed');
    });
});

server.listen(8080, () => {
    console.log('Server listening on port 8080');
});


يتم استخدام طريقة الأنابيب لتوجيه تدفق البيانات من تيار إلى آخر.
  • في هذه الحالة، تتم قراءة الملف وضغطه باستخدام Gzip، ثم كتابته إلى ملف جديد.
  • حالات الاستخدام في العالم الحقيقي للتدفقات

4.1 التعامل مع الملفات الكبيرة

عند التعامل مع الملفات الكبيرة (مثل السجلات أو الوسائط)، فإن تحميل الملف بأكمله في الذاكرة غير فعال ويمكن أن يسبب مشكلات في الأداء. تمكنك التدفقات من قراءة الملفات الكبيرة أو كتابتها بشكل متزايد، مما يقلل الحمل على الذاكرة.

مثال:

    حالة الاستخدام
  • : مشغل وسائط يقوم بدفق ملفات الفيديو أو الصوت.
  • الحل
  • : يضمن استخدام التدفقات أن يقوم المشغل بتحميل أجزاء من البيانات فقط في المرة الواحدة، مما يؤدي إلى تحسين أداء التشغيل وتقليل التخزين المؤقت.
  • 4.2 معالجة البيانات في الوقت الحقيقي

تحتاج تطبيقات الوقت الفعلي مثل خوادم الدردشة أو لوحات المعلومات المباشرة إلى معالجة البيانات فور وصولها. توفر التدفقات طريقة للتعامل مع هذه البيانات بكفاءة، مما يقلل من زمن الوصول.

مثال:

    حالة الاستخدام
  • : لوحة معلومات لمراقبة أسعار الأسهم.
  • الحل
  • : تسمح التدفقات للخادم بمعالجة أسعار الأسهم الواردة في الوقت الفعلي ودفع التحديثات إلى واجهة المستخدم.
  • 4.3 ضغط الملفات وإلغاء ضغطها

يعد الضغط حالة استخدام شائعة أخرى للتدفقات. بدلاً من تحميل الملف بأكمله إلى الذاكرة، يمكنك ضغط البيانات بسرعة باستخدام تدفقات التحويل.

مثال:

    حالة الاستخدام
  • : أنظمة النسخ الاحتياطي التي تقوم بضغط الملفات الكبيرة قبل حفظها.
  • الحل
  • : تسمح التدفقات بقراءة الملفات وضغطها بشكل متزايد، مما يوفر الوقت ويقلل من أثر الذاكرة.
  • مزايا استخدام التدفقات

    كفاءة الذاكرة
  1. : تعمل التدفقات على أجزاء من البيانات، مما يقلل من الذاكرة المطلوبة لمعالجة الملفات الكبيرة أو مجموعات البيانات.
  2. تحسين الأداء
  3. : تعمل معالجة البيانات بشكل متزايد على تقليل الوقت اللازم لتحميل ومعالجة كميات كبيرة من المعلومات.
  4. الإدخال/الإخراج غير المحظور
  5. : تستفيد التدفقات من بنية Node.js غير المتزامنة، مما يسمح للخادم بمعالجة المهام الأخرى أثناء معالجة البيانات.
  6. معالجة البيانات في الوقت الفعلي
  7. : تسمح التدفقات بالاتصال في الوقت الفعلي، وهي مثالية لتطبيقات الويب التي تتطلب نقل البيانات بزمن وصول منخفض.
  8. المرونة
  9. : يمكن دمج التدفقات، ونقلها عبر الأنابيب، وتحويلها، مما يجعلها أداة قوية لخطوط أنابيب معالجة البيانات المعقدة.
  10. خاتمة

توفر تدفقات Node.js طريقة مرنة وفعالة للتعامل مع كميات كبيرة من البيانات، سواء كنت تقرأ الملفات، أو تعالج طلبات الشبكة، أو تنفذ عمليات في الوقت الفعلي. من خلال تقسيم البيانات إلى أجزاء يمكن التحكم فيها، تسمح لك التدفقات بالعمل مع مجموعات كبيرة من البيانات دون إرباك ذاكرة النظام.

في المقالة التالية، سنستكشف

NGINX

ودوره في خدمة المحتوى الثابت، وموازنة التحميل، والعمل كوكيل عكسي في تطبيقات Node.js. سنناقش أيضًا كيفية دمج SSL والتشفير لتعزيز الأمان.

بيان الافراج يتم استنساخ هذه المقالة على: https://dev.to/imsushant12/ftive-data-handling-with-nodejs-treams-4483؟1 إذا كان هناك أي انتهاك ، فيرجى الاتصال بـ [email protected] لحذفه.
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3