Prije nego počnem, moram otići
U ovom članku želio bih pogledati sloj koji je odgovoran za pohranjivanje datoteka i kako ga svatko može koristiti.
U prošlom članku sam malo "zakotrljao bačvu". ipfs, ali to se dogodilo upravo u kontekstu problema koji sam rješavao. Sve u svemu, mislim da je ovaj projekt super. Više volim mogućnost stvaranja različitih mreža za različite zadatke. To vam omogućuje bolju organizaciju strukture i smanjenje opterećenja pojedinačnih čvorova i mreže u cjelini. Čak iu okviru jednog projekta, ako je potrebno, možete podijeliti mrežu na dijelove prema nekim kriterijima, smanjujući ukupno opterećenje.
Dakle, Storacle koristi mehanizam
- Datoteke se mogu dodati u repozitorij kroz bilo koji čvor.
- Datoteke se spremaju u cijelosti, a ne u blokovima.
- Svaka datoteka ima svoj jedinstveni hash sadržaja za daljnji rad s njom.
- Datoteke se mogu duplicirati radi veće pouzdanosti
- Broj datoteka na jednom čvoru ograničen je samo datotečnim sustavom (postoji iznimka, više o tome u nastavku)
- Broj datoteka u mreži ograničen je mogućnostima širenja prema broju valjanih čvorova u mreži, koji će u drugoj verziji moći raditi s beskonačnim brojem čvorova (više o tome u drugom članku)
Jednostavan primjer kako to općenito funkcionira iz programa:
poslužitelj:
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);
}
})();
Klijent:
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);
}
})();
Pogled iznutra
Ispod haube nema ničeg otmjenog. Podaci o broju datoteka, njihovoj ukupnoj veličini i drugim točkama pohranjuju se u bazu podataka u memoriji i ažuriraju se kada se datoteke brišu i dodaju, tako da nema potrebe za čestim pristupom datotečnom sustavu. Izuzetak je omogućavanje skupljača smeća kada trebate cirkulirati datoteke kada se dosegne određena veličina pohrane, a ne zabraniti dodavanje novih. U ovom slučaju morate zaobići pohranu, a rad s velikim brojem datoteka (> recimo milijun) može dovesti do značajnih opterećenja. I bolje je pohraniti manje datoteka i pokrenuti više čvorova. Ako je "čistač" onemogućen, onda nema takvog problema.
Pohrana datoteka sastoji se od 256 mapa i 2 razine ugniježđivanja. Datoteke se pohranjuju u mape druge razine. Odnosno, ako ih ima 1 milijun. U svakoj takvoj mapi bit će oko 62500 1000000 datoteka (256 XNUMX XNUMX / sqrt(XNUMX)).
Imena mapa formirana su iz hash datoteke tako da joj možete brzo pristupiti ako znate hash.
Ova struktura je odabrana na temelju velikog broja različitih zahtjeva za pohranu: podrška za slabe datotečne sustave, gdje nije poželjno imati mnogo datoteka u jednoj mapi, brzo prolaženje svih mapa ako je potrebno, itd. Neka vrsta zlatne sredine.
predmemoriranje
Prilikom dodavanja datoteka, kao i kada ih primate, poveznice na datoteke zapisuju se u predmemoriju.
Zahvaljujući tome, vrlo često nema potrebe proći cijelu mrežu u potrazi za datotekom. Time se ubrzava primanje veza i smanjuje opterećenje mreže. Predmemoriranje se također događa putem http zaglavlja.
Izomorfija
Klijent je napisan u javascriptu i izomorfan je, može se koristiti izravno iz preglednika.
Možete učitati datoteku
Odgođene veze
Zanimljiva značajka je i "odgođena referenca". Ovo je poveznica na datoteku koja se može dobiti sinkrono, ovdje i sada, a datoteka će biti povučena gore kada se već nađe u pohrani. Ovo je vrlo zgodno kada, na primjer, trebate prikazati neke slike na web mjestu. Samo smo stavili odgođenu vezu u src i to je to. Možete smisliti mnogo slučajeva.
API klijenta
- async Client.prototype.storeFile() - spremanje datoteke
- async Client.prototype.getFileLink() — dobivanje izravne poveznice na datoteku
- async Client.prototype.getFileLinks() — dobivanje popisa izravnih poveznica na datoteku sa svih čvorova na kojima ona postoji
- async Client.prototype.getFileToBuffer() — staviti datoteku u međuspremnik
- async Client.prototype.getFileToPath() — dobiti datoteku u datotečni sustav
- async Client.prototype.getFileToBlob() — dobiti datoteku u blob (za verziju preglednika)
- async Client.prototype.removeFile() - izbrisati datoteku
- Client.prototype.createRequestedFileLink() — stvoriti odgođenu vezu
Izvoz datoteka na drugi poslužitelj
Da biste prenijeli datoteke na drugi čvor, možete:
- Samo kopirajte cijelu mapu za pohranu zajedno s postavkama. (ovo možda neće raditi u budućnosti)
- Kopirajte samo mapu s datotekama. Ali, u ovom slučaju, morat ćete pokrenuti funkciju jednom čvor.normalizeFilesInfo()preračunati sve podatke i unijeti ih u bazu podataka.
- Koristite funkciju node.exportFiles()koji će početi kopirati datoteke.
Osnovne postavke čvora
Prilikom pokretanja čvora za pohranu možete odrediti sve potrebne postavke.
Opisat ću one najosnovnije, ostale možete pronaći na Githubu.
- skladištenje.veličina podataka — veličina mape s datotekama
- skladištenje.tempSize — veličina privremene mape
- skladištenje.autoCleanSize — minimalna veličina skladišta koju je potrebno držati. Ako navedete ovaj parametar, čim počne ponestajati prostora, datoteke koje se najmanje koriste bit će izbrisane.
- datoteka.maxSize — maksimalna veličina datoteke
- datoteka.minSize — minimalna veličina datoteke
- file.preferredDuplicates — željeni broj duplikata datoteka na mreži
- file.mimeWhitelist - važeće vrste datoteka
- datoteka.mimeCrna lista - nevažeće vrste datoteka
- file.extWhitelist - važeće ekstenzije datoteka
- file.extBlacklist - nevažeći nastavci datoteka
- file.linkCache - razne postavke predmemoriranja veza
Gotovo svi parametri koji se odnose na dimenzije mogu se unijeti u apsolutnim i relativnim vrijednostima.
Rad preko naredbenog retka
Knjižnica se može koristiti putem naredbenog retka. Da biste to učinili, trebate ga instalirati globalno: npm i -g storacle. Nakon toga možete pokrenuti potrebne akcije iz direktorija projekta u kojem se nalazi čvor. Na primjer, storacle -a storeFile -f ./file.txt -c ./config.jsza dodavanje datoteke. Sve radnje možete pronaći u
Zašto bi vam ovo moglo trebati?
- Ako želite stvoriti neku vrstu decentraliziranog projekta u kojem planirate pohranjivati i raditi s datotekama koristeći prikladne metode. Na primjer, glazbeni projekt opisan na poveznici na početku članka koristi skladište.
- Ako radite na bilo kojem drugom projektu gdje trebate pohranjivati datoteke na distribuiran način. Možete jednostavno izgraditi svoju zatvorenu mrežu, fleksibilno konfigurirati čvorove i dodati nove po potrebi.
- Ako samo trebate negdje pohraniti datoteke svoje web stranice i previše vam je da sve sami pišete. Možda je ova biblioteka prikladnija od drugih u vašem slučaju.
- Ako imate projekt u kojem radite s datotekama, ali želite izvršiti sve manipulacije iz preglednika. Možete izbjeći pisanje poslužiteljskog koda.
Moji kontakti:
Izvor: www.habr.com