
Para fillimin, duhet të lë , në mënyrë që të kuptohet se për çfarë është fjala.
Në këtë artikull do të doja të diskutoja për layer-in që merret me ruajtjen e skedarëve dhe mënyrën se si mund të përdoret nga çdo person. , nuk ka lidhje të drejtpërdrejtë me muzikën. Mund të organizoni ruajtjen e çdo skedari.
Në artikullin e mëparshëm, pak "e kritikova" ipfs, por kjo ndodhi në kontekstin e detyrës time. Në përgjithësi, unë e konsideroj këtë projekt të mrekullueshëm. Më pëlqen më shumë mundësia për të krijuar rrjeta të ndryshme për detyra të ndryshme. Kjo lejon një organizim më të mirë të strukturës dhe redukton ngarkesën në nyjat individuale dhe rrjetin si një tërësi. Madje, brenda një projekti të caktuar, mund të ndajmë rrjetin në copa sipas disa kritereve, duke ulur ngarkesën totale.
Pra, storacle përdor mekanizmin për organizimin e rrjetit. Karakteristikat kryesore:
- Skedarët mund të shtohen në ruajtje përmes çdo nyje.
- Skedarët ruhen tërësisht, jo në blloqe.
- Çdo skedar ka një hash unik sipas përmbajtjes për punë të mëtejshme me të.
- Skedarët mund të dublifikohen 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 të flasim më poshtë)
- Numri i skedarëve në rrjet është i kufizuar nga mundësitë e spreadable sipas numrit të nyjeve të pranueshme në rrjet, të cilat në versionin e dytë do të lejojnë punën me një numër të pafund nyjesh (për këtë në një artikull tjetër)
Një shembull i thjeshtë, si funksionon kjo në realitet:
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);
}
})();Pamja nga brenda
Nën kapak nuk ka asgjë të jashtëzakonshme. Informacioni mbi numrin e skedarëve, madhësinë e tyre totale dhe çështje të tjera ruhet në një bazë të dhënash in-memory dhe përditësohet me fshirjen dhe shtimin e skedarëve, kështu që nuk ka nevojë të afrohemi shpesh te sistemi i skedarëve. Përjashtim është aktivizimi i mbledhësit të plehrave, kur është e nevojshme të qarkullojnë skedarët kur arrihen disa madhësi të ruajtjes, e jo ndaluar shtimin e të rinjve. Në këtë rast, duhet të kalojmë përreth ruajtjes, dhe puna me një numër të madh skedarësh (> një milion themi) mund të sjellë ngarkesa të mëdha. Dhe është më mirë të ruajmë më pak skedarë dhe të aktivizojmë më shumë nyje. Nëse "pastruesi" është i çaktivizuar, atëherë nuk ka këtë problem.
Ruajtja e skedarëve përbëhet nga 256 dosje dhe 2 nivele thellësie. Skedarët ruhen në dosjet e nivelit të dytë. Pra, nëse kemi 1 milion skedarë, në çdo dosje të tillë do të jenë rreth 62500 (1000000 / sqrt(256)).
Emrat e dosjeve formohen nga heshini i skedarit, për t'u qasur shpejt duke e ditur hashin.
Kjo strukturë u zgjodh duke marrë parasysh një numër të madh kërkesash për ruajtjen: mbështetje për sisteme të dobëta dosjesh, ku nuk është e dëshirueshme të kemi shumë skedarë në një dosje, kalim të shpejtë përmes të gjitha dosjeve në nevojë, etj. Një kompromise e artë.
Kešimi
Në momentin e shtimit të skedarëve, si dhe kur i marrim, në cache shkruhen lidhjet për skedarët.
Për shkak të kësaj, shpesh nuk është e nevojshme të kalojmë gjithë rrjetin për të kërkuar skedarin. Kjo përshpejton fitimin e lidhjeve dhe zvogëlon ngarkesën në rrjet. Gjithashtu, caching ndodh përmes titujve http.
Izomorfizmi
Klienti është shkruar në javascript dhe është izomorfik, mund të përdoret drejtpërdrejt nga shfletuesi.
Mund të ngarkohet skedari si një skenar dhe të qaseni në window.ClientStoracle ose ta importoni përmes sistemit të ndërtimit etj.
Lidhjet e shtyra
Një veçori interesante është "lidhja e shtyrë". Kjo është një lidhje për një skedar, e cila mund të merret në mënyrë sinkrone, këtu dhe tani, ndërsa skedari do të tërhiqet kur të gjendet në ruajtje. Kjo është shumë e përshtatshme, kur, për shembull, duhet të shfaqni disa imazhe në web. Thjesht vendosim lidhjen e shtyrë në src dhe gjithçka është në rregull. Mund të krijoni shumë raste.
Api i klientit
- async Client.prototype.storeFile() — ruajtja e skedarit
- async Client.prototype.getFileLink() — marrja e një lidhjeje direkte për skedarin
- async Client.prototype.getFileLinks() — marrja e një liste lidhjesh direkte për skedarin nga të gjitha nyjet ku ai ndodhet
- async Client.prototype.getFileToBuffer() — merrni skedarin në buffer
- async Client.prototype.getFileToPath() — merrni skedarin në sistemin e skedarëve
- async Client.prototype.getFileToBlob() — merrni skedarin në blob (për versionin e shfletuesit)
- async Client.prototype.removeFile() — fshij skedarin
- Client.prototype.createRequestedFileLink() — krijoni një lidhje të shtyrë
Eksportimi i skedarëve në një server tjetër
Për të transferuar skedarët në një nod të tjetër mund të:
- Thjesht kopjoni tërë folderin e ruajtjes së dhënash së bashku me konfigurimet. (në të ardhmen kjo mund të mos funksionojë)
- Kopjoni vetëm folderin me skedarët. Por, në këtë rast, duhet të ngatërroni njëherë funksionin node.normalizeFilesInfo(), për të ri llogaritur të gjithë të dhënat dhe për t'i futur në bazë.
- Përdorni funksionin node.exportFiles(), i cili do të fillojë kopjimin e skedarëve.
Cilësimet kryesore të nodit
Duke nisur nodin e ruajtjes, mund të specifikoni të gjitha cilësimet e nevojshme.
Do të përshkruaj ato më themelore, të tjerat mund të gjenden në GitHub.
- storage.dataSize — madhësia e folderit me skedarët
- storage.tempSize — madhësia e folderit të përkohshëm
- storage.autoCleanSize — madhësia minimale e ruajtjes që duhet mbajtur. Nëse specifikohet ky parameter, sapo të fillojë të mungojë hapësira, skedarët më pak të përdorur do të fshihen.
- file.maxSize — madhësia maksimale e skedarëve
- file.minSize — madhësia minimale e skedarëve
- file.preferredDuplicates — numri i preferuar i dublikateve të skedarëve në rrjet
- file.mimeWhitelist — llojet e skedarëve të lejuara
- file.mimeBlacklist — llojet e skedarëve të ndaluara
- file.extWhitelist — zgjerimet e skedarëve të lejuara
- file.extBlacklist — zgjerimet e skedarëve të ndaluara
- file.linkCache — cilësime të ndryshme për caching të lidhjeve
Gati të gjitha parametrat që lidhen me madhësitë mund të përcaktohen në vlera absolute dhe relative.
Puna përmes linjës së komandave
Biblioteka mund të përdoret përmes linjës së komandave. Për këtë, duhet ta instaloni atë globalisht: npm i -g storacle. Pas kësaj, mund të filloni veprimet e nevojshme nga direktoria me projektin, ku është nodi. 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ë
Pse mund t'ju nevojitet kjo
- Nëse dëshironi të krijoni një projekt decentralizuar, në të cilin parashikohet të ruani dhe të punoni me skedarët në mënyra të përshtatshme. Për shembull, projekti me muzikë, i përshkruar në lidhjen në fillim të artikullit, përdor storacle.
- Nëse punoni në projekte të tjera, ku nevojitet ruajtja e skedarëve në mënyrë të shpërndarë. Mund të organizoni lehtësisht një rrjet të mbyllur, të përshtatni nënat dhe të shtoni të reja, kur të jetë e nevojshme.
- Nëse ju nevojitet thjesht të ruani skedarët e faqes tuaj dhe nuk dëshironi të shkruani gjithçka vetë. Ndërsa kjo bibliotekë mund të jetë më e përshtatshme për ju.
- Nëse keni një projekt, ku punoni me skedarët, por dëshironi që të gjitha manipulimet të bëhen nga shfletuesi. Mund të evitoni shkruajturin e kodit server.
Kontaktet e mia:
Burimi: habr.com
