Pirms es sÄku, man jÄdodas prom
Å ajÄ rakstÄ es vÄlÄtos aplÅ«kot slÄni, kas ir atbildÄ«gs par failu glabÄÅ”anu, un kÄ to var izmantot ikviens.
IepriekÅ”ÄjÄ rakstÄ nedaudz āuzripinÄju mucuā. ipfs, bet tas notika tieÅ”i tÄs problÄmas kontekstÄ, kuru es risinu. KopumÄ es domÄju, ka Å”is projekts ir forÅ”s. Es vienkÄrÅ”i dodu priekÅ”roku iespÄjai izveidot dažÄdus tÄ«klus dažÄdiem uzdevumiem. Tas ļauj labÄk organizÄt struktÅ«ru un samazinÄt atseviŔķu mezglu un tÄ«kla slodzi kopumÄ. Pat viena projekta ietvaros, ja nepiecieÅ”ams, var sadalÄ«t tÄ«klu gabalos pÄc kÄdiem kritÄrijiem, samazinot kopÄjo slodzi.
TÄtad Storacle izmanto mehÄnismu
- Failus var pievienot krÄtuvei, izmantojot jebkuru mezglu.
- Faili tiek saglabÄti pilnÄ«bÄ, nevis blokos.
- Katram failam ir savs unikÄls satura sajaukums turpmÄkam darbam ar to.
- Lai nodroÅ”inÄtu lielÄku uzticamÄ«bu, failus var dublÄt
- Failu skaitu vienÄ mezglÄ ierobežo tikai failu sistÄma (ir izÅÄmums, vairÄk par to tÄlÄk)
- Failu skaitu tÄ«klÄ ierobežo izkliedÄjamÄs iespÄjas atbilstoÅ”i derÄ«go mezglu skaitam tÄ«klÄ, kas otrajÄ versijÄ varÄs strÄdÄt ar bezgalÄ«gu skaitu mezglu (vairÄk par to citÄ rakstÄ)
VienkÄrÅ”s piemÄrs tam, kÄ tas parasti darbojas no programmas:
Serveris:
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);
}
})();
Klients:
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);
}
})();
IekÅ”Ä izskats
Zem pÄrsega nav nekÄ grezna. InformÄcija par failu skaitu, to kopÄjo lielumu un citiem punktiem tiek glabÄta atmiÅas datu bÄzÄ un tiek atjauninÄta, kad faili tiek dzÄsti un pievienoti, tÄpÄc nav nepiecieÅ”ams bieži piekļūt failu sistÄmai. IzÅÄmums ir atkritumu savÄcÄja iespÄjoÅ”ana, kad nepiecieÅ”ams izplatÄ«t failus, kad ir sasniegts noteikts krÄtuves lielums, nevis aizliegt jaunu failu pievienoÅ”anu. Å ajÄ gadÄ«jumÄ jums ir apiet krÄtuvi, un darbs ar lielu skaitu failu (> teiksim, miljons) var izraisÄ«t ievÄrojamas slodzes. Un labÄk ir saglabÄt mazÄk failu un palaist vairÄk mezglu. Ja "tÄ«rÄ«tÄjs" ir atspÄjots, tad Å”Ädas problÄmas nav.
Failu krÄtuve sastÄv no 256 mapÄm un 2 ligzdoÅ”anas lÄ«meÅiem. Faili tiek glabÄti otrÄ lÄ«meÅa mapÄs. Tas ir, ja ir 1 milj. KatrÄ Å”ÄdÄ mapÄ bÅ«s aptuveni 62500 1000000 failu (256 XNUMX XNUMX / kvadrÄtkilometri (XNUMX)).
Mapju nosaukumi tiek veidoti no faila hash, lai jÅ«s varÄtu Ätri piekļūt, ja zinÄt jaucÄjkodu.
Å Ä« struktÅ«ra tika izvÄlÄta, pamatojoties uz lielu skaitu dažÄdu uzglabÄÅ”anas prasÄ«bu: atbalsts vÄjÄm failu sistÄmÄm, kur nav vÄlams, lai vienÄ mapÄ bÅ«tu daudz failu, nepiecieÅ”amÄ«bas gadÄ«jumÄ Ätra visu mapju apceļoÅ”ana utt. Kaut kÄds zelta vidusceļŔ.
keÅ”atmiÅa
Pievienojot failus, kÄ arÄ« tos saÅemot, saites uz failiem tiek ierakstÄ«tas keÅ”atmiÅÄ.
Pateicoties tam, ļoti bieži nav nepiecieÅ”ams ŔķÄrsot visu tÄ«klu, meklÄjot failu. Tas paÄtrina saiÅ”u saÅemÅ”anu un samazina tÄ«kla slodzi. KeÅ”atmiÅa notiek arÄ«, izmantojot http galvenes.
Izomorfija
Klients ir rakstÄ«ts javascript un ir izomorfs, to var izmantot tieÅ”i no pÄrlÅ«kprogrammas.
Varat augÅ”upielÄdÄt failu
AtliktÄs saites
Interesanta iezÄ«me ir arÄ« āatliktÄ atsauceā. Å Ä« ir saite uz failu, kuru var iegÅ«t sinhroni Å”eit un tagad, un fails tiks izvilkts, kad tas jau bÅ«s atrasts krÄtuvÄ. Tas ir ļoti Ärti, ja, piemÄram, jums ir jÄparÄda daži attÄli vietnÄ. MÄs vienkÄrÅ”i ievietojÄm atlikto saiti src, un tas arÄ« viss. JÅ«s varat izdomÄt daudzus gadÄ«jumus.
Klienta API
- async Client.prototype.storeFile() - faila saglabÄÅ”ana
- async Client.prototype.getFileLink() ā iegÅ«t tieÅ”u saiti uz failu
- async Client.prototype.getFileLinks() ā iegÅ«t tieÅ”o saiÅ”u sarakstu uz failu no visiem mezgliem, kur tas pastÄv
- async Client.prototype.getFileToBuffer() ā iegÅ«t failu buferÄ«
- async Client.prototype.getFileToPath() ā iegÅ«t failu failu sistÄmÄ
- async Client.prototype.getFileToBlob() ā iegÅ«t failu blob (pÄrlÅ«ka versijai)
- async Client.prototype.removeFile() - izdzÄst failu
- Client.prototype.createRequestedFileLink() ā izveidot atlikto saiti
EksportÄjiet failus uz citu serveri
Lai pÄrsÅ«tÄ«tu failus uz citu mezglu, varat:
- VienkÄrÅ”i nokopÄjiet visu krÄtuves mapi kopÄ ar iestatÄ«jumiem. (tas var nedarboties nÄkotnÄ)
- KopÄjiet tikai mapi ar failiem. Bet Å”ajÄ gadÄ«jumÄ funkcija bÅ«s jÄpalaiž vienu reizi node.normalizeFilesInfo()lai pÄrrÄÄ·inÄtu visus datus un ievadÄ«tu tos datu bÄzÄ.
- izmantot funkciju node.exportFiles()kas sÄks kopÄt failus.
Pamata mezgla iestatījumi
StartÄjot krÄtuves mezglu, varat norÄdÄ«t visus nepiecieÅ”amos iestatÄ«jumus.
Es aprakstÄ«Å”u visvienkÄrÅ”Äkos, pÄrÄjos var atrast Github.
- storage.dataSize ā mapes ar failiem lielums
- uzglabÄÅ”ana.tempSize ā pagaidu mapes lielums
- storage.autoCleanSize ā minimÄlais uzglabÄÅ”anas apjoms, kas jÄuzglabÄ. Ja norÄdÄt Å”o parametru, tad, tiklÄ«dz sÄk pietrÅ«kt vietas, vismazÄk izmantotie faili tiks dzÄsti.
- fails.maxSize ā maksimÄlais faila lielums
- fails.minSize ā minimÄlais faila lielums
- file.preferredDublikÄti ā vÄlamais failu dublikÄtu skaits tÄ«klÄ
- file.mimeWhitelist - derīgi failu tipi
- file.mimeMelnais saraksts - nederīgi failu tipi
- file.extWhitelist - derÄ«gi failu paplaÅ”inÄjumi
- file.extMelnais saraksts - nederÄ«gi failu paplaÅ”inÄjumi
- file.linkCache - dažÄdi saiÅ”u keÅ”atmiÅas iestatÄ«jumi
GandrÄ«z visus parametrus, kas saistÄ«ti ar izmÄriem, var ievadÄ«t gan absolÅ«tÄ, gan relatÄ«vÄ vÄrtÄ«bÄ.
Darbs, izmantojot komandrindu
BibliotÄku var izmantot, izmantojot komandrindu. Lai to izdarÄ«tu, tas jÄinstalÄ globÄli: npm i -g Storacle. PÄc tam jÅ«s varat palaist nepiecieÅ”amÄs darbÄ«bas no projekta direktorija, kurÄ atrodas mezgls. PiemÄram, storacle -a storeFile -f ./file.txt -c ./config.jslai pievienotu failu. Visas darbÄ«bas var atrast
KÄpÄc jums tas varÄtu bÅ«t vajadzÄ«gs?
- Ja vÄlaties izveidot kÄdu decentralizÄtu projektu, kurÄ plÄnojat uzglabÄt un strÄdÄt ar failiem, izmantojot Ärtas metodes. PiemÄram, mÅ«zikas projekts, kas aprakstÄ«ts raksta sÄkumÄ esoÅ”ajÄ saitÄ, izmanto krÄtuve.
- Ja strÄdÄjat ar citiem projektiem, kur faili jÄglabÄ izplatÄ«tÄ veidÄ. Varat viegli izveidot savu slÄgto tÄ«klu, elastÄ«gi konfigurÄt mezglus un vajadzÄ«bas gadÄ«jumÄ pievienot jaunus.
- Ja jums vienkÄrÅ”i kaut kur jÄglabÄ vietnes faili un jums ir pÄrÄk daudz rakstÄ«t visu pats. IespÄjams, Ŕī bibliotÄka jÅ«su gadÄ«jumÄ ir labÄk piemÄrota nekÄ citas.
- Ja jums ir projekts, kurÄ strÄdÄjat ar failiem, bet vÄlaties veikt visas manipulÄcijas no pÄrlÅ«kprogrammas. Varat izvairÄ«ties no servera koda rakstÄ«Å”anas.
Mani kontakti:
Avots: www.habr.com