Storacle - ruajtja e decentralizuar e skedarëve

Storacle - ruajtja e decentralizuar e skedarëve

Para se të filloj, duhet të largohem lidhje me artikullin e mëparshëmnë mënyrë që të jetë e qartë se për çfarë saktësisht po flasim.

Në këtë artikull do të doja të shikoja shtresën që është përgjegjëse për ruajtjen e skedarëve dhe se si mund të përdoret nga kushdo. Storacle është një bibliotekë e pavarur, nuk ka lidhje të drejtpërdrejtë me muzikën. Ju mund të organizoni ruajtjen e çdo skedari.

Në artikullin e mëparshëm, e "rrokullisi fuçinë" pak më tutje ipfs, por kjo ndodhi pikërisht në kuadrin e problemit që po zgjidhja. Në përgjithësi, mendoj se ky projekt është i lezetshëm. Unë thjesht preferoj aftësinë për të krijuar rrjete të ndryshme për detyra të ndryshme. Kjo ju lejon të organizoni më mirë strukturën dhe të zvogëloni ngarkesën në nyjet individuale dhe rrjetin në tërësi. Edhe në kuadër të një projekti, nëse është e nevojshme, mund ta ndani rrjetin në copa sipas disa kritereve, duke ulur ngarkesën e përgjithshme.

Pra, storacle përdor mekanizmin i përhapur për organizimin e një rrjeti. Karakteristikat kryesore:

  • Skedarët mund të shtohen në depo përmes çdo nyje.
  • Skedarët ruhen tërësisht, jo në blloqe.
  • Çdo skedar ka hash-in e vet unik të përmbajtjes për punë të mëtejshme me të.
  • Skedarët mund të dublikohen për 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, më shumë rreth tij më poshtë)
  • Numri i skedarëve në rrjet është i kufizuar nga aftësitë e përhapjes sipas numrit të nyjeve të vlefshme në rrjet, të cilat në versionin e dytë do të mund të punojnë me një numër të pafund nyjesh (më shumë për këtë në një artikull tjetër)

Një shembull i thjeshtë se si funksionon kjo në përgjithësi 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);
  }
})();

Pamje e brendshme

Nuk ka asgjë të zbukuruar nën kapuç. Informacioni në lidhje me numrin e skedarëve, madhësinë totale të tyre dhe pikat e tjera ruhen në një bazë të dhënash në memorie dhe përditësohen kur skedarët fshihen dhe shtohen, kështu që nuk ka nevojë të aksesoni shpesh sistemin e skedarëve. Një përjashtim është aktivizimi i grumbulluesit të mbeturinave kur duhet të qarkulloni skedarë kur arrihet një madhësi e caktuar e ruajtjes dhe të mos ndaloni shtimin e të rejave. Në këtë rast, duhet të anashkaloni ruajtjen dhe puna me një numër të madh skedarësh (> le të themi një milion) mund të çojë në ngarkesa të konsiderueshme. Dhe është më mirë të ruash më pak skedarë dhe të ekzekutosh më shumë nyje. Nëse "pastruesi" është i çaktivizuar, atëherë nuk ka një problem të tillë.

Ruajtja e skedarëve përbëhet nga 256 dosje dhe 2 nivele foleje. Skedarët ruhen në dosje të nivelit të dytë. Domethënë nëse janë 1 milion. Do të ketë rreth 62500 skedarë në çdo dosje të tillë (1000000 / sqrt(256)).

Emrat e dosjeve formohen nga hash-i i skedarit në mënyrë që të mund t'i qaseni shpejt nëse e dini hash-in.

Kjo strukturë u zgjodh bazuar në një numër të madh kërkesash të ndryshme ruajtjeje: mbështetje për sisteme të dobëta skedarësh, ku nuk është e dëshirueshme të ketë shumë skedarë në një dosje, kalim i shpejtë i të gjithë dosjeve nëse është e nevojshme, etj. Një lloj mesatarja e artë.

caching

Kur shtoni skedarë, si dhe kur merrni ato, lidhjet me skedarët shkruhen në cache.
Falë kësaj, shumë shpesh nuk ka nevojë të përshkosh të gjithë rrjetin në kërkim të një skedari. Kjo përshpejton marrjen e lidhjeve dhe zvogëlon ngarkesën në rrjet. Memoria e memories ndodh gjithashtu nëpërmjet titujve http.

Izomorfia

Klienti është i shkruar në javascript dhe është izomorfik, mund të përdoret direkt nga shfletuesi. 
Ju mund të ngarkoni skedarin https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js si skript dhe akses dritare.ClientStoracle ose importoni përmes sistemit të ndërtimit, etj.

Lidhje të shtyra

Një veçori interesante është gjithashtu "referenca e shtyrë". Kjo është një lidhje për një skedar që mund të merret në mënyrë sinkrone, këtu dhe tani, dhe skedari do të tërhiqet kur të gjendet tashmë në memorie. Kjo është shumë e përshtatshme kur, për shembull, duhet të shfaqni disa fotografi në sit. Ne thjesht vendosëm një lidhje të shtyrë në src dhe kaq. Mund të dilni me shumë raste.

API-ja e klientit

  • async Client.prototype.storeFile() - ruajtja e skedarit
  • async Client.prototype.getFileLink() — duke marrë një lidhje të drejtpërdrejtë me skedarin
  • async Client.prototype.getFileLinks() — marrja e një liste lidhjesh direkte me një skedar nga të gjitha nyjet ku ai ekziston
  • async Client.prototype.getFileToBuffer() — futeni skedarin në buffer
  • async Client.prototype.getFileToPath() - merrni një skedar në sistemin e skedarëve
  • async Client.prototype.getFileToBlob() — merrni skedarin në blob (për versionin e shfletuesit)
  • async Client.prototype.removeFile() - fshini një skedar
  • Client.prototype.createRequestedFileLink() — krijoni një lidhje të shtyrë

Eksporto skedarët në një server tjetër

Për të transferuar skedarë në një nyje tjetër, mund të:

  • Thjesht kopjoni të gjithë dosjen e ruajtjes së bashku me cilësimet. (kjo mund të mos funksionojë në të ardhmen)
  • Kopjoni vetëm dosjen me skedarë. Por, në këtë rast, do t'ju duhet ta ekzekutoni funksionin një herë node.normalizeFilesInfo()për të rillogaritur të gjitha të dhënat dhe për t'i futur ato në bazën e të dhënave.
  • Përdorni funksionin node.exportFiles()e cila do të fillojë kopjimin e skedarëve.

Cilësimet bazë të nyjeve
Kur filloni nyjen e ruajtjes, mund të specifikoni të gjitha cilësimet e nevojshme.
Unë do të përshkruaj ato më themelore, pjesa tjetër mund të gjendet në Github.

  • ruajtje.madhësia e të dhënave — madhësia e dosjes me skedarë
  • ruajtja.tempMadhësia — madhësia e përkohshme e dosjes
  • ruajtje.autoCleanSize — madhësia minimale e ruajtjes që duhet mbajtur. Nëse specifikoni këtë parametër, atëherë sapo hapësira të fillojë të mbarojë, skedarët më pak të përdorur do të fshihen.
  • skedari.maxSize - madhësia maksimale e skedarit
  • skedari.minSize - madhësia minimale e skedarit
  • file.preferredDublicates — numri i preferuar i kopjimeve të skedarëve në rrjet
  • skedar.mimeLista e bardhë - Llojet e vlefshme të skedarëve
  • skedar.mimeLista e zezë - Llojet e skedarëve të pavlefshëm
  • skedari.extWhitelist - shtesat e vlefshme të skedarëve
  • skedar.extlista e zezë - shtesa të pavlefshme skedarësh
  • file.linkCache - cilësime të ndryshme të memorizimit të lidhjeve

Pothuajse të gjithë parametrat që lidhen me dimensionet mund të futen në vlera absolute dhe relative.

Puna përmes linjës së komandës
Biblioteka mund të përdoret përmes linjës së komandës. Për ta bërë këtë, duhet ta instaloni globalisht: npm i -g storacle. Pas kësaj, mund të nisni veprimet e nevojshme nga drejtoria e projektit ku ndodhet nyja. Për shembull, storacle -a storeFile -f ./file.txt -c ./config.jspër të shtuar skedarin. Të gjitha veprimet mund të gjenden në https://github.com/ortexx/storacle/blob/master/bin/actions.js

Pse mund t'ju duhet kjo?

  • Nëse dëshironi të krijoni një lloj projekti të decentralizuar në të cilin planifikoni të ruani dhe punoni me skedarë duke përdorur metoda të përshtatshme. Për shembull, projekti muzikor i përshkruar në lidhjen në fillim të artikullit përdor depo.
  • Nëse punoni në ndonjë projekt tjetër ku duhet të ruani skedarët në një mënyrë të shpërndarë. Mund të ndërtoni lehtësisht rrjetin tuaj të mbyllur, të konfiguroni në mënyrë fleksibël nyjet dhe të shtoni të reja kur është e nevojshme.
  • Nëse thjesht duhet të ruani skedarët e faqes tuaj të internetit diku dhe është shumë për ju që të shkruani gjithçka vetë. Ndoshta kjo bibliotekë është më e përshtatshme se të tjerat në rastin tuaj.
  • Nëse keni një projekt në të cilin punoni me skedarë, por dëshironi të kryeni të gjitha manipulimet nga shfletuesi. Mund të shmangni shkrimin e kodit të serverit.

Kontaktet e mia:

Burimi: www.habr.com

Shto një koment