Storacle - تخزين الملفات اللامركزية

Storacle - تخزين الملفات اللامركزية

قبل أن أبدأ، يجب أن أغادر رابط للمقال السابقبحيث يكون من الواضح ما نتحدث عنه بالضبط.

في هذه المقالة أود أن ألقي نظرة على الطبقة المسؤولة عن تخزين الملفات، وكيف يمكن لأي شخص استخدامها. Storacle هي مكتبة قائمة بذاتهالا يوجد اتصال مباشر بالموسيقى. يمكنك تنظيم تخزين أي ملفات.

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

لذا يستخدم المخزن الآلية قابل للدهن لتنظيم الشبكة. دلائل الميزات:

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

مثال بسيط لكيفية عمل ذلك بشكل عام من البرنامج:

الخادم:

const  Node = require('storacle').Node;

(async () => {
  try {
    const node = new Node({
      port: 4000,
      hostname: 'localhost'
    });
    await node.init();
  }
  catch(err) {
    console.error(err.stack);
    process.exit(1);
  }
})();

лиент:

const  Client = require('storacle').Client;

(async () => {
  try {
    const client = new  Client({
      address: 'localhost:4000'
    });
    await client.init();
    const hash = await client.storeFile('./my-file');
    const link = await client.getFileLink(hash); 
    await client.removeFile(hash);
  }
  catch(err) {
    console.error(err.stack);
    process.exit(1);
  }
})();

منظر داخلي

لا يوجد شيء فاخر تحت غطاء محرك السيارة. يتم تخزين المعلومات حول عدد الملفات وحجمها الإجمالي والنقاط الأخرى في قاعدة بيانات في الذاكرة ويتم تحديثها عند حذف الملفات وإضافتها، لذلك ليست هناك حاجة للوصول إلى نظام الملفات بشكل متكرر. الاستثناء هو تمكين أداة تجميع البيانات المهملة عندما تحتاج إلى توزيع الملفات عند الوصول إلى حجم تخزين معين، وعدم منع إضافة ملفات جديدة. في هذه الحالة، يتعين عليك تجاوز مساحة التخزين، وقد يؤدي العمل مع عدد كبير من الملفات (> مليون مثلاً) إلى تحميلات كبيرة. ومن الأفضل تخزين عدد أقل من الملفات وتشغيل المزيد من العقد. إذا تم تعطيل "المنظف"، فلا توجد مشكلة من هذا القبيل.

يتكون تخزين الملفات من 256 مجلدًا ومستويين من التداخل. يتم تخزين الملفات في مجلدات المستوى الثاني. يعني لو كان هناك مليون. سيكون هناك حوالي 2 ملف في كل مجلد (1 / sqrt(62500)).

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

تم اختيار هذه البنية بناءً على عدد كبير من متطلبات التخزين المختلفة: دعم أنظمة الملفات الضعيفة، حيث لا يُفضل وجود العديد من الملفات في مجلد واحد، والتنقل السريع لجميع المجلدات إذا لزم الأمر، وما إلى ذلك. نوع من الوسط الذهبي.

التخزين المؤقت

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

التماثل

العميل مكتوب بلغة جافا سكريبت وهو متماثل ويمكن استخدامه مباشرة من المتصفح. 
يمكنك تحميل الملف https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js باعتباره البرنامج النصي والوصول window.ClientStorcle أو الاستيراد من خلال نظام البناء، وما إلى ذلك.

الروابط المؤجلة

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

واجهة برمجة تطبيقات العميل

  • المتزامن Client.prototype.storeFile() - حفظ الملف
  • المتزامن Client.prototype.getFileLink() - الحصول على رابط مباشر للملف
  • المتزامن Client.prototype.getFileLinks() - الحصول على قائمة بالروابط المباشرة للملف من كافة العقد الموجودة فيه
  • المتزامن Client.prototype.getFileToBuffer() - الحصول على الملف في المخزن المؤقت
  • المتزامن Client.prototype.getFileToPath() - الحصول على ملف في نظام الملفات
  • المتزامن Client.prototype.getFileToBlob() - احصل على الملف بتنسيق blob (لإصدار المتصفح)
  • المتزامن Client.prototype.removeFile() - حذف ملف
  • Client.prototype.createRequestedFileLink() - إنشاء رابط مؤجل

تصدير الملفات إلى خادم آخر

لنقل الملفات إلى عقدة أخرى، يمكنك:

  • ما عليك سوى نسخ مجلد التخزين بالكامل مع الإعدادات. (قد لا ينجح هذا في المستقبل)
  • انسخ المجلد الذي يحتوي على الملفات فقط. ولكن، في هذه الحالة، سوف تحتاج إلى تشغيل الوظيفة مرة واحدة Node.normalizeFilesInfo()لإعادة حساب جميع البيانات وإدخالها في قاعدة البيانات.
  • استخدام الوظيفة العقدة.exportFiles()والتي سوف تبدأ في نسخ الملفات.

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

  • Storage.dataSize - حجم المجلد الذي يحتوي على الملفات
  • Storage.tempSize - حجم المجلد المؤقت
  • Storage.autoCleanSize - الحد الأدنى لحجم التخزين الذي يجب الاحتفاظ به. إذا قمت بتحديد هذه المعلمة، فبمجرد أن تبدأ المساحة في النفاد، سيتم حذف الملفات الأقل استخدامًا.
  • file.maxSize - حجم الملف الأقصى
  • file.minSize - الحد الأدنى لحجم الملف
  • file.preferredDuplicates — العدد المفضل من الملفات المكررة على الشبكة
  • file.mimeWhitelist - أنواع الملفات الصالحة
  • file.mimeBlacklist - أنواع الملفات غير صالحة
  • file.extWhitelist - امتدادات الملفات صالحة
  • file.extBlacklist - امتدادات الملفات غير صالحة
  • file.linkCache - إعدادات التخزين المؤقت للارتباط المختلفة

يمكن إدخال جميع المعلمات المتعلقة بالأبعاد تقريبًا بالقيم المطلقة والنسبية.

العمل عبر سطر الأوامر
يمكن استخدام المكتبة عبر سطر الأوامر. للقيام بذلك، تحتاج إلى تثبيته عالميًا: npm i -g storcle. بعد ذلك، يمكنك تشغيل الإجراءات اللازمة من دليل المشروع حيث توجد العقدة. على سبيل المثال، storacle -a storeFile -f ./file.txt -c ./config.jsلإضافة الملف. يمكن العثور على جميع الإجراءات في https://github.com/ortexx/storacle/blob/master/bin/actions.js

لماذا قد تحتاج هذا؟

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

اتصالاتي:

المصدر: www.habr.com

إضافة تعليق