
Para se filloj, duhet të lë , 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. , 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 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 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ë
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
