
Prije nego što započnem, moram ostaviti , kako bi bilo jasno o čemu se zapravo radi.
U ovom članku bih želio obraditi sloj koji je odgovoran za pohranu datoteka i kako to može iskoristiti bilo koja osoba. , nema direktne veze s muzikom. Može se organizirati pohrana bilo kojih datoteka.
U prethodnom članku malo sam "napao" ipfs, ali to se dogodilo upravo u kontekstu problema koji sam rješavao. U načelu, smatram ovaj projekt sjajnim. Samo mi više odgovara mogućnost stvaranja različitih mreža za različite zadatke. To omogućava bolju organizaciju strukture i smanjenje opterećenja na pojedinim čvorovima i mreži u cjelini. Čak se i unutar jednog određenog projekta, ako je potrebno, može razbiti mreža na dijelove prema nekim kriterijima, smanjujući ukupno opterećenje.
Dakle, storacle koristi mehanizam za organizaciju mreže. Glavne karakteristike:
- Datoteke se mogu dodavati u skladište putem bilo kojeg čvora.
- Datoteke se čuvaju u cijelini, ne blokovima.
- Svaka datoteka ima svoj jedinstveni hash prema sadržaju 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 (ima iznimaka, o tome će biti riječi kasnije)
- Broj datoteka u mreži ograničen je mogućnostima spreadable po broju dopuštenih čvorova u mreži, koji će u drugoj verziji moći raditi s beskrajnim brojem čvorova (o tome u drugom članku)
Jednostavan primjer kako to zapravo funkcionira iz programa:
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);
}
})();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čega nadnaravnog. Informacije o broju datoteka, njihovoj ukupnoj veličini i drugim aspektima čuvaju se u in-memory bazi i ažuriraju se prilikom brisanja i dodavanja datoteka, stoga nema potrebe često pristupati datotečnom sustavu. Iznimka su aktivacije sakupljača smeća, kada je potrebna cirkulacija datoteka kada se dostigne određena veličina pohrane, a ne zabrana dodavanja novih. U tom slučaju potrebno je obići pohranu, a rad s velikim brojem datoteka (> milijun recimo) može uzrokovati značajna opterećenja. Bolje je čuvati manje datoteka i pokretati više čvorova. Ako je "čišćenje" onemogućeno, taj problem ne postoji.
Pohrana datoteka se sastoji od 256 mapa i 2 razine ugniježđenja. Datoteke se nalaze u mapama druge razine. To znači da, s 1 milijunom datoteka, svaka takva mapa ima oko 62500 datoteka (1000000 / sqrt(256)).
Nazivi mapa formiraju se iz hash-a datoteka, kako bi se moglo brzo pristupiti kada se zna hash.
Takva struktura je odabrana na temelju velikog broja različitih zahtjeva za pohranu: podrška za slabe datotečne sustave, gdje nije poželjno imati puno datoteka u jednoj mapi, brzo obilazak svih mapa kada je potrebno, itd. Neka zlatna sredina.
Keširanje
Prilikom dodavanja datoteka, kao i prilikom njihovog preuzimanja, u keš se zapisuje poveznice na datoteke.
Zahvaljujući tome, vrlo često nema potrebe prelaziti cijelu mrežu u potrazi za datotekom. To ubrzava dobivanje poveznica i smanjuje opterećenje na mreži. Također, keširanje se događa putem http zaglavlja.
Izomorfizam
Klijent je napisan na JavaScript-u i izomorfan je, može se koristiti direktno iz preglednika.
Možete učitati datoteku kao skriptu i dobiti pristup window.ClientStoracle ili je uvesti kroz sustav gradnje itd.
Odložene poveznice
Zanimljiva značajka također je "odložena poveznica". To je poveznica na datoteku, koju možete dobiti sinkrono, ovdje i sada, dok će se datoteka preuzeti kada bude pronađena u pohrani. To je vrlo korisno, kada, na primjer, trebate prikazati neke slike na webu. Jednostavno postavite odloženu poveznicu u src i to je to. Mnoge situacije su moguće.
Api klijent
- (196 tisuća redaka koda, 11 autora, 7 commitera, 11 neodgovorenih problema); Client.prototype.storeFile() — spremanje datoteke
- (196 tisuća redaka koda, 11 autora, 7 commitera, 11 neodgovorenih problema); Client.prototype.getFileLink() — dobivanje izravne poveznice na datoteku
- (196 tisuća redaka koda, 11 autora, 7 commitera, 11 neodgovorenih problema); Client.prototype.getFileLinks() — dobivanje popisa izravnih poveznica na datoteku sa svih čvorova na kojima postoji
- (196 tisuća redaka koda, 11 autora, 7 commitera, 11 neodgovorenih problema); Client.prototype.getFileToBuffer() — preuzeti datoteku u memorijski prostor
- (196 tisuća redaka koda, 11 autora, 7 commitera, 11 neodgovorenih problema); Client.prototype.getFileToPath() — preuzeti datoteku u datotečni sustav
- (196 tisuća redaka koda, 11 autora, 7 commitera, 11 neodgovorenih problema); Client.prototype.getFileToBlob() — preuzeti datoteku u blob (za verziju preglednika)
- (196 tisuća redaka koda, 11 autora, 7 commitera, 11 neodgovorenih problema); Client.prototype.removeFile() — ukloni datoteku
- Client.prototype.createRequestedFileLink() — stvoriti odgođenu poveznicu
Izvoz datoteka na drugi server
Da biste prenijeli datoteke na drugi čvor, možete:
- Jednostavno kopirati cijelu mapu pohrane zajedno s postavkama. (u budućnosti to možda neće raditi)
- Kopirati samo mapu s datotekama. No, u tom slučaju, potrebno je jednom pokrenuti funkciju node.normalizeFilesInfo(), kako bi se preračunali svi podaci i unijeli u bazu.
- Koristiti funkciju node.exportFiles(), koja započinje kopiranje datoteka.
Osnovne postavke čvora
Pokretanjem čvora pohrane, možete navesti sve potrebne postavke.
Opišem najosnovnije, ostalo možete naći na GitHubu.
- storage.dataSize — veličina mape s datotekama
- storage.tempSize — veličina privremene mape
- storage.autoCleanSize — minimalna veličina pohrane koja se mora održavati. Ako navedete ovu vrijednost, čim prostor počne nedostajati, najneiskorištenije datoteke će biti izbrisane.
- file.maxSize — maksimalna veličina datoteke
- file.minSize — minimalna veličina datoteke
- file.preferredDuplicates — preferirani broj duplicata datoteke u mreži
- file.mimeWhitelist — prihvatljive vrste datoteka
- file.mimeBlacklist — neprihvatljive vrste datoteka
- file.extWhitelist — prihvatljive ekstenzije datoteka
- file.extBlacklist — neprihvatljive ekstenzije datoteka
- file.linkCache — razne postavke predmemoriranja poveznica
Gotovo svi parametri povezani s veličinama mogu se postaviti i u apsolutnim i u relativnim vrijednostima.
Rad preko naredbenog retka
Biblioteku možete koristiti preko naredbenog retka. Za to je potrebno instalirati je globalno: npm i -g storacle. Nakon toga možete pokretati potrebne akcije iz direktorija s projektom gdje se nalazi čvor. Na primjer, storacle -a storeFile -f ./file.txt -c ./config.js, kako biste dodali datoteku. Sve akcije možete pronaći na
Zašto bi ti ovo moglo biti potrebno
- Ako želiš stvoriti neki decentralizirani projekt u kojem se planira pohranjivati i raditi s datotekama na praktične načine. Na primjer, projekt s muzikom, opisan na linku na početku članka, koristi storacle.
- Ako radite na bilo kojim drugim projektima gdje je potrebno distribuirano pohranjivanje datoteka. Možete lako izgraditi svoju privatnu mrežu, fleksibilno postavljati čvorove i dodavati nove kada je to potrebno.
- Ako vam je samo potrebno negdje pohraniti datoteke svog web-mjesta i ne želite sve sami pisati. Ova biblioteka bi mogla bolje odgovarati vašim potrebama.
- Ako imate projekt u kojem radite s datotekama, ali želite sve manipulacije izvršavati iz preglednika. Možete izbjeći pisanje serverskog koda.
Moji kontakti:
Izvor: habr.com
