
Voordat ek begin, moet ek vertrek sodat dit duidelik is waaroor ons presies praat.
In hierdie artikel wil ek kyk na die laag wat verantwoordelik is vir die stoor van lêers, en hoe dit deur enigiemand gebruik kan word. , daar is geen direkte verband met musiek nie. U kan die berging van enige lêers organiseer.
In die vorige artikel het ek die vat bietjie “gerol”. ipfs, maar dit het presies gebeur in die konteks van die probleem wat ek opgelos het. Oor die algemeen dink ek hierdie projek is cool. Ek verkies net die vermoë om verskillende netwerke vir verskillende take te skep. Dit laat jou toe om die struktuur beter te organiseer en die las op individuele nodusse en die netwerk as geheel te verminder. Selfs binne die raamwerk van een projek, indien nodig, kan jy die netwerk in stukke verdeel volgens sekere kriteria, wat die algehele las verminder.
Storacle gebruik dus die meganisme vir die organisering van 'n netwerk. Sleutel kenmerke:
- Lêers kan deur enige nodus by die bewaarplek gevoeg word.
- Lêers word heeltemal gestoor, nie in blokke nie.
- Elke lêer het sy eie unieke inhoud-hash vir verdere werk daarmee.
- Lêers kan gedupliseer word vir groter betroubaarheid
- Die aantal lêers op een nodus word slegs deur die lêerstelsel beperk (daar is 'n uitsondering, meer daaroor hieronder)
- Die aantal lêers in die netwerk word beperk deur die verspreibare vermoëns volgens die aantal geldige nodusse in die netwerk, wat in die tweede weergawe met 'n oneindige aantal nodusse sal kan werk (meer hieroor in 'n ander artikel)
'n Eenvoudige voorbeeld van hoe dit oor die algemeen vanaf die program werk:
Bediener:
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);
}
})();
Kliënt:
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);
}
})();
Binne-aansig
Daar is niks fancy onder die enjinkap nie. Inligting oor die aantal lêers, hul totale grootte en ander punte word in 'n in-geheue databasis gestoor en word opgedateer wanneer lêers uitgevee en bygevoeg word, so dit is nie nodig om gereeld toegang tot die lêerstelsel te kry nie. 'n Uitsondering is om die vullisverwyderaar te aktiveer wanneer jy lêers moet sirkuleer wanneer 'n sekere berginggrootte bereik is, en nie die toevoeging van nuwes verbied nie. In hierdie geval moet jy die berging omseil, en werk met 'n groot aantal lêers (> sê 'n miljoen) kan tot aansienlike vragte lei. En dit is beter om minder lêers te stoor en meer nodusse te laat loop. As die "skoonmaker" gedeaktiveer is, is daar nie so 'n probleem nie.
Die lêerberging bestaan uit 256 dopgehou en 2 vlakke van nes. Lêers word in tweedevlak-vouers gestoor. Dit is, as daar 1 miljoen is. Daar sal ongeveer 62500 1000000 lêers in elke sodanige vouer wees (256 XNUMX XNUMX / sqrt(XNUMX)).
Die vouername word uit die lêer-hash gevorm sodat jy vinnig toegang daartoe kan kry as jy die hash ken.
Hierdie struktuur is gekies op grond van 'n groot aantal verskillende bergingsvereistes: ondersteuning vir swak lêerstelsels, waar dit nie wenslik is om baie lêers in een vouer te hê nie, vinnige deurloop van alle vouers indien nodig, ens. Een of ander goue middeweg.
kas
Wanneer lêers bygevoeg word, sowel as wanneer hulle dit ontvang, word skakels na lêers na die kas geskryf.
Danksy dit is dit baie dikwels nie nodig om die hele netwerk te deurkruis op soek na 'n lêer nie. Dit versnel die ontvangs van skakels en verminder die las op die netwerk. Caching vind ook plaas via http-opskrifte.
Isomorfie
Die kliënt is in javascript geskryf en is isomorf, dit kan direk vanaf die blaaier gebruik word.
Jy kan die lêer oplaai as 'n skrif en toegang venster.ClientStoracle of invoer deur die boustelsel, ens.
Uitgestelde skakels
'n Interessante kenmerk is ook "uitgestelde verwysing". Dit is 'n skakel na 'n lêer wat sinchronies verkry kan word, hier en nou, en die lêer sal opgetrek word wanneer dit reeds in die stoor gevind word. Dit is baie gerieflik wanneer jy byvoorbeeld 'n paar prente op die webwerf moet wys. Ons het net 'n uitgestelde skakel in src gesit en dit is dit. Jy kan met baie gevalle vorendag kom.
Kliënt API
- asinkroniseer Client.prototype.storeFile() - stoor die lêer
- asinkroniseer Client.prototype.getFileLink() - om 'n direkte skakel na die lêer te kry
- asinkroniseer Client.prototype.getFileLinks() - kry 'n lys van direkte skakels na 'n lêer vanaf alle nodusse waar dit bestaan
- asinkroniseer Client.prototype.getFileToBuffer() - kry die lêer in die buffer
- asinkroniseer Client.prototype.getFileToPath() - kry 'n lêer in die lêerstelsel
- asinkroniseer Client.prototype.getFileToBlob() - kry die lêer in blob (vir blaaierweergawe)
- asinkroniseer Client.prototype.removeFile() - verwyder 'n lêer
- Client.prototype.createRequestedFileLink() - skep 'n uitgestelde skakel
Voer lêers uit na 'n ander bediener
Om lêers na 'n ander nodus oor te dra, kan jy:
- Kopieer net die hele stoormap saam met die instellings. (dit sal dalk nie in die toekoms werk nie)
- Kopieer slegs die lêergids met lêers. Maar in hierdie geval sal jy die funksie een keer moet laat loop node.normalizeFilesInfo()om al die data te herbereken en in die databasis in te voer.
- Gebruik funksie node.exportFiles()wat sal begin om lêers te kopieer.
Basiese nodus instellings
Wanneer u die stoorknoop begin, kan u al die nodige instellings spesifiseer.
Ek sal die mees basiese beskryf, die res kan op Github gevind word.
- stoor.datagrootte - grootte van die gids met lêers
- stoor.tempSize - tydelike gidsgrootte
- storage.autoCleanSize — die minimum stoorgrootte wat gehou moet word. As u hierdie parameter spesifiseer, sal die minste gebruikte lêers uitgevee word sodra die spasie begin opraak.
- file.maxSize - maksimum lêergrootte
- lêer.minGrootte - minimum lêergrootte
- file.preferredDuplicates - voorkeur aantal lêer duplikate op die netwerk
- file.mimeWhitelist - geldige lêertipes
- file.mimeSwartlys - ongeldige lêertipes
- file.extWhitelist - geldige lêeruitbreidings
- file.extSwartlys - ongeldige lêeruitbreidings
- file.linkCache - verskeie skakelkasinstellings
Byna alle parameters wat met dimensies verband hou, kan in beide absolute en relatiewe waardes ingevoer word.
Werk via die opdragreël
Die biblioteek kan via die opdragreël gebruik word. Om dit te doen moet jy dit wêreldwyd installeer: npm i -g stoor. Hierna kan u die nodige aksies begin vanaf die projekgids waar die nodus is. Byvoorbeeld, storacle -a storeLêer -f ./file.txt -c ./config.jsom die lêer by te voeg. Alle aksies kan gevind word in
Hoekom het jy dit dalk nodig?
- As jy 'n soort van gedesentraliseerde projek wil skep waarin jy van plan is om lêers te stoor en te werk met behulp van gerieflike metodes. Byvoorbeeld, die musiekprojek wat in die skakel aan die begin van die artikel beskryf word, gebruik stoorplek.
- As jy aan enige ander projekte werk waar jy lêers op 'n verspreide wyse moet stoor. Jy kan maklik jou geslote netwerk bou, nodusse buigsaam opstel en nuwes byvoeg wanneer nodig.
- As jy net jou webwerflêers iewers moet stoor en dit is te veel vir jou om alles self te skryf. Miskien is hierdie biblioteek beter geskik as ander in jou geval.
- As jy 'n projek het waarin jy met lêers werk, maar alle manipulasies van die blaaier wil uitvoer. U kan vermy om bedienerkode te skryf.
My kontakte:
Bron: will.com
