
Enne kui alustan, pean lahkuma , et oleks selge, millest me täpselt räägime.
Selles artiklis tahaksin analüüsida kihti, mis vastutab failide salvestamise eest, ja seda, kuidas igaüks seda kasutada saab. Muusikaga pole otsest seost. Saate korraldada mis tahes failide salvestust.
Eelmises artiklis läksin natuke liiale ipfs, aga see juhtus just selle probleemi kontekstis, mida ma lahendasin. Üldiselt arvan, et see projekt on lahe. Eelistan lihtsalt võimalust luua erinevate ülesannete jaoks erinevaid võrke. See võimaldab paremat korraldust ja vähendab koormust nii üksikutele sõlmedele kui ka võrgule tervikuna. Vajadusel saate võrgu isegi ühe projekti piires kindlate kriteeriumide alusel osadeks jagada, vähendades seeläbi üldist koormust.
Seega kasutab storacle mehhanismi võrgu korraldamiseks. Peamised omadused:
- Faile saab hoidlasse lisada mis tahes sõlme kaudu.
- Failid salvestatakse tervikuna, mitte plokkidena.
- Igal failil on oma unikaalne sisu räsi edasiseks tööks.
- Suurema usaldusväärsuse tagamiseks saab faile dubleerida.
- Ühes sõlmes olevate failide arvu piirab ainult failisüsteem (on ka erand, sellest lähemalt allpool)
- Võrgus olevate failide arvu piirab võrgus lubatud sõlmede arvu hajutatavus, mis teises versioonis suudab töötada lõpmatu arvu sõlmedega (sellest lähemalt teises artiklis).
Lihtne näide programmist, kuidas see toimib:
Server:
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);
}
})();
Klient:
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);
}
})();
Seestvaade
Kapoti all pole midagi uhket. Teave failide arvu, kogumahu ja muude üksikasjade kohta salvestatakse mälusisesesse andmebaasi ning seda värskendatakse failide kustutamisel ja lisamisel, seega pole vaja failisüsteemile sageli ligi pääseda. Erandiks on prügikorje lubamine, mis nõuab failide rotatsiooni teatud salvestusmahu saavutamisel, mitte uute lisamise takistamist. Sellisel juhul tuleb salvestusruum läbida ja suure hulga failide (näiteks üle miljoni) käitlemine võib põhjustada märkimisväärset koormust. Parem on salvestada vähem faile ja käitada rohkem sõlmi. Kui prügikorje on keelatud, seda probleemi ei teki.
Failisalvestus koosneb 256 kaustast ja kahest pesastamistasandist. Failid salvestatakse teise taseme kaustadesse. See tähendab, et kui faile on 1 miljon, sisaldab iga kaust ligikaudu 62 500 (1 000 000 / ruutjalga (256)).
Kaustade nimed moodustatakse faili räsi põhjal, et neile saaks räsi teades kiiresti ligi.
See struktuur valiti suure hulga erinevate salvestusnõuete põhjal: nõrkade failisüsteemide tugi, kus on ebasoovitav hoida palju faile ühes kaustas, vajadusel kõigi kaustade kiire läbimine jne. Omamoodi kuldne kesktee.
vahemällu salvestamine
Failide lisamisel ja vastuvõtmisel kirjutatakse failide lingid vahemällu.
See välistab sageli vajaduse faili leidmiseks kogu võrku läbida. See kiirendab linkide hankimist ja vähendab võrgukoormust. Vahemällu salvestamine toimub ka HTTP päiste kaudu.
Isomorfism
Klient on kirjutatud JavaScriptis ja on isomorfne, seda saab kasutada otse brauserist.
Saate faili üles laadida skriptina ja saada juurdepääs aken.KlientStoracle või importida ehitussüsteemi kaudu jne.
Edasilükatud lingid
Teine huvitav funktsioon on "edasilükatud link". See on link failile, mida saab sünkroonselt, siin ja praegu hankida, ning fail hangitakse kohe, kui see salvestusruumist leitakse. See on väga mugav näiteks siis, kui peate veebisaidil pilte kuvama. Lisage lihtsalt edasilükatud link lähtetekstile (src) ja ongi kõik. Kasutusjuhtumeid on palju.
Kliendi API
- async Klient.prototüüp.storeFile() - faili salvestamine
- async Klient.prototüüp.getFileLink() - failile otselingi saamine
- async Klient.prototüüp.getFileLinks() - faili otselinkide loendi saamine kõigist sõlmedest, kus see asub
- async Klient.prototüüp.getFileToBuffer() — saada fail puhvrisse
- async Klient.prototüüp.getFileToPath() — faili lisamine failisüsteemi
- async Klient.prototüüp.getFileToBlob() — hankige fail blob-vormingus (brauseriversiooni jaoks)
- async Klient.prototüüp.eemaldaFail() - faili kustutamine
- Klient.prototüüp.createRequestedFileLink() - loo edasilükatud link
Ekspordi failid teisele serverile
Failide teisele sõlmele edastamiseks saate teha järgmist.
- Kopeeri lihtsalt kogu salvestuskaust koos sätetega. (See ei pruugi tulevikus toimida.)
- Kopeeri ainult failidega kaust. Sellisel juhul pead aga funktsiooni üks kord käivitama. node.normalizeFilesInfo()kõik andmed uuesti arvutada ja andmebaasi sisestada.
- Kasutage funktsiooni node.exportFiles(), mis hakkab faile kopeerima.
Sõlme põhiseaded
Salvestussõlme käivitamisel saate määrata kõik vajalikud sätted.
Kirjeldan neist kõige põhilisemaid, ülejäänud leiate GitHubist.
- salvestusruumi.andmete suurus — failidega kausta suurus
- salvestusruumi.ajutineSize — ajutise kausta suurus
- salvestusruum.autoCleanSize — minimaalne salvestusruumi suurus. Selle parameetri määramisel kustutatakse kõige vähem kasutatud failid kohe, kui ruumist ebapiisavaks saab.
- fail.maxSize — maksimaalne faili suurus
- fail.minSuurus — minimaalne faili suurus
- fail.eelistatudDuplikaadid — eelistatud failiduplikaatide arv võrgus
- fail.mimeValge nimekiri — vastuvõetavad failitüübid
- fail.mimeMust nimekiri - sobimatud failitüübid
- file.extValge nimekiri — vastuvõetavad faililaiendid
- fail.extMust nimekiri - sobimatud faililaiendid
- fail.linkCache - erinevad linkide vahemällu salvestamise seaded
Peaaegu kõiki mõõtmetega seotud parameetreid saab määrata nii absoluutsete kui ka suhteliste väärtustena.
Käsurea kaudu töötamine
Teeki saab kasutada käsurea kaudu. Selleks installige see globaalselt: npm i -g storaclePärast seda saate käivitada vajalikud toimingud projektikataloogist, kus sõlm asub. Näiteks storacle -a storeFile -f ./file.txt -c ./config.jsfaili lisamiseks. Kõik toimingud leiate jaotisest
Miks sul seda vaja võiks minna?
- Kui soovite luua detsentraliseeritud projekti, mis võimaldab teil faile mugavate meetodite abil salvestada ja hallata. Näiteks artikli alguses oleval lingil kirjeldatud muusikaprojekt kasutab hoidla.
- Kui töötate mõne muu projekti kallal, mis nõuab hajutatud failisalvestust, saate hõlpsalt luua oma privaatvõrgu, paindlikult konfigureerida sõlmi ja vajadusel uusi lisada.
- Kui vajad lihtsalt kohta oma veebisaidi failide salvestamiseks ja ei viitsi kõike ise kirjutada, võib see teek sinu vajadustele paremini sobida.
- Kui sul on projekt, kus töötad failidega, aga soovid kõiki toiminguid teha brauserist, võid serveripoolse koodi kirjutamist vältida.
Minu kontaktid:
Allikas: www.habr.com
