Хадгалах - төвлөрсөн бус файл хадгалах

Хадгалах - төвлөрсөн бус файл хадгалах

Эхлэхээсээ өмнө би явах ёстой өмнөх нийтлэлийн холбоосИнгэснээр бид яг юуны тухай ярьж байгаа нь тодорхой болно.

Энэ нийтлэлд би файлуудыг хадгалах үүрэгтэй давхарга, түүнийг хэн ч хэрхэн ашиглаж болох талаар авч үзэхийг хүсч байна. Storcle бол бие даасан номын сан юм, хөгжимтэй шууд холбоо байхгүй. Та ямар ч файлын хадгалалтыг зохион байгуулж болно.

Өмнөх нийтлэлд би "баррель" бага зэрэг өнхрүүлсэн ipfs, гэхдээ энэ нь яг миний шийдэж байсан асуудлын хүрээнд болсон. Ерөнхийдөө би энэ төслийг гайхалтай гэж бодож байна. Би зүгээр л өөр өөр ажилд зориулж өөр өөр сүлжээ үүсгэх чадварыг илүүд үздэг. Энэ нь бүтцийг илүү сайн зохион байгуулах, бие даасан зангилаа болон сүлжээнд ачааллыг бууруулах боломжийг олгодог. Нэг төслийн хүрээнд ч гэсэн шаардлагатай бол сүлжээг зарим шалгуурын дагуу хэсэг болгон хувааж, нийт ачааллыг бууруулж болно.

Тиймээс 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 сая байгаа бол гэсэн үг. Ийм хавтас бүрт 62500 орчим файл байх болно (1000000 / sqrt(256)).

Хавтасны нэрийг файлын хэшээс үүсгэсэн бөгөөд хэрэв та хэшийг мэддэг бол түүнд хурдан хандах боломжтой.

Энэ бүтцийг олон тооны хадгалалтын шаардлагад үндэслэн сонгосон: сул файлын системийг дэмжих, нэг хавтсанд олон файл байх нь зохисгүй, шаардлагатай бол бүх хавтас руу хурдан шилжих гэх мэт. Ямар нэг алтан дундаж.

кэш хийх

Файл нэмэх, мөн тэдгээрийг хүлээн авах үед файлуудын холбоосыг кэш рүү бичдэг.
Үүний ачаар файл хайхдаа бүхэл бүтэн сүлжээг тойрон гарах шаардлагагүй байдаг. Энэ нь холбоос хүлээн авах үйл явцыг хурдасгаж, сүлжээн дэх ачааллыг бууруулдаг. Мөн кэш нь http толгойгоор дамжин хийгддэг.

Изоморфи

Үйлчлүүлэгч нь javascript дээр бичигдсэн бөгөөд изоморф бөгөөд үүнийг хөтөчөөс шууд ашиглах боломжтой. 
Та файлыг байршуулж болно https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js скрипт болон хандалт хэлбэрээр window.ClientStoracle эсвэл бүтээх системээр дамжуулан импортлох гэх мэт.

Хойшлогдсон холбоосууд

Сонирхолтой шинж чанар нь "хойшлогдсон лавлагаа" юм. Энэ бол энд, одоо синхроноор авах боломжтой файлын холбоос бөгөөд файлыг хадгалах санд аль хэдийн олдсон үед татаж авах болно. Жишээлбэл, та сайт дээр зарим зураг харуулах шаардлагатай үед энэ нь маш тохиромжтой. Бид зүгээр л хойшлуулсан холбоосыг src-д оруулаад л болоо. Та олон тохиолдол гаргаж болно.

Үйлчлүүлэгчийн API

  • асинк 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()бүх өгөгдлийг дахин тооцоолж, мэдээллийн санд оруулах.
  • функцийг ашиглах node.exportFiles()Энэ нь файлуудыг хуулж эхэлнэ.

Үндсэн зангилааны тохиргоо
Хадгалах цэгийг эхлүүлэх үед та шаардлагатай бүх тохиргоог зааж өгч болно.
Би хамгийн энгийн зүйлсийг тайлбарлах болно, үлдсэнийг нь Github дээрээс олж болно.

  • хадгалах.өгөгдлийн хэмжээ — файл бүхий хавтасны хэмжээ
  • хадгалах.tempSize - түр хавтасны хэмжээ
  • storage.autoCleanSize - хадгалах шаардлагатай хамгийн бага хадгалах хэмжээ. Хэрэв та энэ параметрийг зааж өгвөл зай дуусмагц хамгийн бага ашигласан файлууд устах болно.
  • file.maxSize - файлын дээд хэмжээ
  • file.minSize - хамгийн бага файлын хэмжээ
  • file.preferredDuplicates - сүлжээн дэх файлын давхардсан тоо
  • file.mimeWhitellist - хүчинтэй файлын төрлүүд
  • file.mimeХар жагсаалт - буруу файлын төрөл
  • file.extWhitellist - хүчинтэй файлын өргөтгөлүүд
  • file.extХар жагсаалт - хүчингүй файлын өргөтгөлүүд
  • file.linkCache - янз бүрийн холбоосын кэш тохиргоо

Хэмжээтэй холбоотой бараг бүх параметрүүдийг үнэмлэхүй болон харьцангуй утгын аль алинд нь оруулж болно.

Командын мөрөөр ажиллаж байна
Номын санг тушаалын мөрөөр ашиглаж болно. Үүнийг хийхийн тулд та үүнийг дэлхий даяар суулгах хэрэгтэй: npm i -g хадгалагч. Үүний дараа та зангилаа байгаа төслийн лавлахаас шаардлагатай үйлдлүүдийг эхлүүлж болно. Жишээлбэл, storacle -a storeFile -f ./file.txt -c ./config.jsфайлыг нэмэх. Бүх үйлдлүүдийг эндээс олж болно https://github.com/ortexx/storacle/blob/master/bin/actions.js

Энэ яагаад танд хэрэгтэй байж болох вэ?

  • Хэрэв та тохиромжтой аргуудыг ашиглан файлуудыг хадгалах, ажиллахаар төлөвлөж буй төвлөрсөн бус төсөл үүсгэхийг хүсч байвал. Жишээлбэл, өгүүллийн эхэнд байгаа холбоос дээр тайлбарласан хөгжмийн төсөл ашигладаг агуулах.
  • Хэрэв та файлуудыг түгээх хэлбэрээр хадгалах шаардлагатай бусад төсөл дээр ажиллаж байгаа бол. Та хаалттай сүлжээгээ хялбархан байгуулж, зангилаануудыг уян хатан тохируулж, шаардлагатай үед шинээр нэмж болно.
  • Хэрэв та вэбсайтынхаа файлуудыг хаа нэгтээ хадгалах хэрэгтэй бол өөрөө бүгдийг бичихэд хэтэрхий их байна. Магадгүй энэ номын сан таны хувьд бусдаас илүү тохиромжтой байх.
  • Хэрэв танд файлтай ажилладаг төсөл байгаа боловч хөтчөөс бүх залруулга хийхийг хүсч байвал. Та серверийн код бичихээс зайлсхийх боломжтой.

Миний харилцагчид:

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх