Storacle — njĂ« magazinĂ« e decentralizuar pĂ«r skedarĂ«

Storacle — njĂ« magazinĂ« e decentralizuar pĂ«r skedarĂ«

Para se filloj, duhet të lë një lidhje me artikullin e mëparshëm, në mënyrë që të kuptohet saktësisht për çfarë po flas.

Në këtë artikull do të doja të shqyrtoj një shtresë që përgjigjet për ruajtjen e skedarëve dhe si kjo mund të përdoret nga kushdo. Storacle është një bibliotekë e pavarur, pa ndonjë lidhje direkte me muzikën. Mund të organizoni ruajtjen e çdo skedari.

Në artikullin e mëparshëm kam folur pak "keq" për ipfs, por kjo ndodhi pikërisht në kontekstin e detyrës që po zgjidhja. Në përgjithësi, e konsideroj këtë projekt të shkëlqyer. Thjesht më pëlqen më shumë mundësia e krijimit të rrjeteve të ndryshme për detyra të ndryshme. Kjo lejon një organizim më të mirë të strukturës dhe redukton ngarkesën në nyjet e veçanta dhe në rrjetin në tërësi. Madje mund të ndajmë rrjetin në pjesë sipas disa kritereve, duke reduktuar ngarkesën totale.

Pra, storacle përdor mekanizmin spreadable për organizimin e rrjetit. Tiparet kryesore:

  • SkedarĂ«t mund tĂ« shtohen nĂ« ruajtje pĂ«rmes çdo nyjeje.
  • SkedarĂ«t ruhen tĂ« tĂ«rĂ«, jo nĂ« blloqe.
  • Çdo skedar ka njĂ« hash unik pĂ«r pĂ«rmbajtjen e tij pĂ«r punĂ« tĂ« mĂ«tejshme.
  • SkedarĂ«t mund tĂ« dublikohet pĂ«r njĂ« besueshmĂ«ri mĂ« tĂ« madhe
  • Numri i skedarĂ«ve nĂ« njĂ« nyje Ă«shtĂ« i kufizuar vetĂ«m nga sistemi i skedarĂ«ve (ka njĂ« pĂ«rjashtim, pĂ«r tĂ« cilin do flasim mĂ« poshtĂ«)
  • Numri i skedarĂ«ve nĂ« rrjet Ă«shtĂ« i kufizuar nga mundĂ«sitĂ« e spreadable pĂ«r numrin e nyjeve tĂ« lejuara nĂ« rrjet, tĂ« cilat nĂ« versionin e dytĂ« do tĂ« lejojnĂ« tĂ« punoni me njĂ« numĂ«r tĂ« pakufizuar nyjesh (pĂ«r kĂ«tĂ« do flasim nĂ« njĂ« artikull tjetĂ«r)

Një shembull i thjeshtë se si funksionon kjo nga programi:

Serveri:

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);
  }
})();

Klienti:

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);
  }
})();

Një pamje nga brenda

Nën kapak nuk ka asgjë sovrane. Informacioni mbi numrin e skedarëve, përmasat e tyre të përbashkëta dhe çështje të tjera ruhen në një bazë të dhënash in-memory dhe përditësohen kur fshihen dhe shtohen skedarë, kështu që nuk ka nevojë të shkojmë shpesh në sistemin e skedarëve. Një përjashtim është aktivizimi i mbledhësit të plehrave, kur është e nevojshme cirkulimi i skedarëve kur arrihen disa përmasa të ruajtjes, e jo ndalimi i shtimit të të rinjve. Në këtë rast, duhet të rrethojmë depozitat dhe puna me një numër të madh skedarësh (> një milion, le të themi) mund të sjellë ngarkesa të konsiderueshme. Dhe është më mirë të ruani më pak skedarë dhe të aktivizoni më shumë nyje. Nëse "pastruesi" është i çaktivizuar, atëherë nuk ka një problem të tillë.

Depozita e skedarëve përbëhet nga 256 mapa dhe 2 nivele thellësie. Skedarët ruhen në mapat e nivelit të dytë. Kështu, me 1 milion skedarë, çdo mapë e tillë do të ketë rreth 62500 copë (1000000 / sqrt(256)).

Emrat e mapave janë formuar nga hash-i i skedarit, për të lejuar qasje të shpejtë, me njohjen e hash-it.

Kjo strukturë është zgjedhur duke marrë parasysh një numër të madh kërkesash të ndryshme për depozitimin: mbështetje për sisteme skedarësh të dobta, ku në një mapë nuk është e dëshirueshme të kemi shumë skedarë, kalim të shpejtë në të gjitha mapat në nevojë, etj. Një mesatare e artë.

KeĆĄimi

Kur shtohen skedarë, si dhe kur merren ata, në keƥ shkruhen lidhjet me skedarët.
Falë kësaj shpesh nuk ka nevojë të kalojmë gjithë rrjetin në kërkim të skedarit. Kjo përshpejton marrjen e lidhjeve dhe zvogëlon ngarkesën në rrjet. Gjithashtu, keƥimi ndodh përmes drejtimeve http.

Izomorfizmi

Klienti është shkruar në javascript dhe është izomorfik, mund të përdoret direkt nga shfletuesi. 
Mund të ngarkohet një skedar https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js si skript dhe të merret qasje në window.ClientStoracle ose importohet përmes sistemit të ndërtimit etj.

Lidhjet e vonuara

Një veçori interesante është gjithashtu "lidhja e vonuar". Ky është një lidhje për një skedar, të cilën mund ta marrim sinkron, këtu dhe tani, ndërsa skedari do të tërhiqet kur të gjendet në depo. Kjo është shumë e dobishme, kur për shembull, duhet të tregojmë disa imazhe në qendër. Thjesht vendosim në src një lidhje të vonuar dhe gjithçka. Mund të imagjinojmë shumë raste.

Api klientit

  • async Client.prototype.storeFile() — ruajtja e skedarit
  • async Client.prototype.getFileLink() — marrja e lidhjes direkte pĂ«r skedarin
  • async Client.prototype.getFileLinks() — marrja e listĂ«s sĂ« lidhjeve tĂ« drejtpĂ«rdrejta pĂ«r skedarin nga tĂ« gjitha nyjat ku ai ekziston
  • async Client.prototype.getFileToBuffer() — merr skedarin nĂ« buffer
  • async Client.prototype.getFileToPath() — merr skedarin nĂ« sistemin e skedarĂ«ve
  • async Client.prototype.getFileToBlob() — merr skedarin nĂ« blob (pĂ«r versione tĂ« shfletuesit)
  • async Client.prototype.removeFile() — heq skedarin
  • Client.prototype.createRequestedFileLink() — krijo lidhje tĂ« shtyrĂ«

Eksporti i skedarëve në një server tjetër

PĂ«r tĂ« ĐżĐ”Ń€Đ”ĐœĐŸŃĐžŃ‚Đž skedarĂ« nĂ« njĂ« nyje tjetĂ«r mund tĂ«:

  • Thjesht kopjoni tĂ« gjithĂ« dosjen e ruajtjes sĂ« skedarĂ«ve me konfigurimet. (nĂ« tĂ« ardhmen kjo mund tĂ« mos funksionojĂ«)
  • Kopjoni vetĂ«m dosjen me skedarĂ«t. Por, nĂ« kĂ«tĂ« rast, do tĂ« duhet tĂ« ekzekutoni njĂ« herĂ« funksionin node.normalizeFilesInfo(), pĂ«r tĂ« ripĂ«rllogaritur tĂ« dhĂ«nat dhe pĂ«r t'i futur nĂ« bazĂ«.
  • PĂ«rdorni funksionin node.exportFiles(), i cili do tĂ« nisĂ« kopjimin e skedarĂ«ve.

Cilësimet themelore të nyjës
Duke e nisur nyjën e ruajtjes, mund të përcaktoni të gjitha cilësimet e nevojshme.
Do të përshkruaj ato më të rëndësishmet, pjesa tjetër mund të gjendet në GitHub.

  • storage.dataSize — madhĂ«sia e dosjes me skedarĂ«t
  • storage.tempSize — madhĂ«sia e dosjes pĂ«rkohshme
  • storage.autoCleanSize — madhĂ«sia minimale e ruajtjes qĂ« duhet mbajtur. NĂ«se pĂ«rcaktoni kĂ«tĂ« parametĂ«r, sa herĂ« qĂ« nuk ka mjaft hapĂ«sirĂ«, skedarĂ«t mĂ« pak tĂ« pĂ«rdorur do tĂ« hiqen.
  • file.maxSize — madhĂ«sia maksimale e skedarit
  • file.minSize — madhĂ«sia minimale e skedarit
  • file.preferredDuplicates — numri preferencial i kopjeve tĂ« skedarit nĂ« rrjet
  • file.mimeWhitelist — tipe tĂ« lejuara tĂ« skedarĂ«ve
  • file.mimeBlacklist — tipe tĂ« ndaluara tĂ« skedarĂ«ve
  • file.extWhitelist — zgjerime tĂ« lejuara tĂ« skedarĂ«ve
  • file.extBlacklist — zgjerime tĂ« ndaluara tĂ« skedarĂ«ve
  • file.linkCache — cilĂ«sime tĂ« ndryshme tĂ« caching pĂ«r lidhjet

Gati të gjithë parametrat e lidhur me madhësitë mund të vendosen edhe në vlera absolute e relative.

Puna nëpërmjet linjës së komanduese
Biblioteka mund të përdoret nëpërmjet linjës së komanduese. Për këtë duhet ta instaloni atë globalisht: npm i -g storacle. Pas kësaj mund të filloni veprimet e nevojshme nga drejtorinë me projektin, ku ndodhet nyja. Për shembull, storacle -a storeFile -f ./file.txt -c ./config.js, për të shtuar një skedar. Të gjitha veprimet mund të gjenden në https://github.com/ortexx/storacle/blob/master/bin/actions.js

Përse mund t'ju nevojitet kjo

  • NĂ«se dĂ«shironi tĂ« krijoni ndonjĂ« projekt tĂ« decentralizuar, nĂ« tĂ« cilin planifikohet ruajtja dhe punimi me skedarĂ« nĂ« metoda tĂ« pĂ«rshtatshme. PĂ«r shembull, projekti me muzikĂ«, i pĂ«rshkruar nĂ« lidhjen nĂ« fillim tĂ« artikullit, pĂ«rdor storacle.
  • NĂ«se po punon nĂ« projekte tĂ« tjera ku nevojitet ruajtja e skedarĂ«ve nĂ« mĂ«nyrĂ« tĂ« shpĂ«rndarĂ«. Mund tĂ« ndĂ«rtosh lehtĂ«sisht rrjetin tĂ«nd tĂ« mbyllur, tĂ« konfigurosh nĂ« mĂ«nyrĂ« fleksibile nyjet dhe tĂ« shtosh tĂ« reja kur Ă«shtĂ« e nevojshme.
  • NĂ«se thjesht tĂ« nevojitet njĂ« vend pĂ«r tĂ« ruajtur skedarĂ«t e faqes tĂ«nde dhe je i ngarkuar tĂ« shkruash gjithçka vetĂ«. Ndoshta kjo bibliotekĂ« do tĂ« pĂ«rshtatet mĂ« mirĂ« pĂ«r ty.
  • NĂ«se ke njĂ« projekt nĂ« tĂ« cilin punon me skedarĂ«, por dĂ«shiron tĂ« kryesh tĂ« gjitha operacionet nga shfletuesi. Mund tĂ« shmangĂ«sh shkruarjen e kodit server.

Kontaktet e mia:

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster