
Prije nego što počnem, moram otići , tako da bude jasno o čemu točno govorimo.
U ovom članku želio bih analizirati sloj koji je odgovoran za pohranu datoteka i kako ga svatko može koristiti. Nema izravne veze s glazbom. Možete organizirati pohranu bilo kojih datoteka.
U prethodnom članku sam malo pretjerao ipfs, ali dogodilo se konkretno u kontekstu problema koji sam rješavao. Sveukupno, mislim da je ovaj projekt super. Jednostavno preferiram mogućnost stvaranja različitih mreža za različite zadatke. To omogućuje bolju organizaciju i smanjuje opterećenje pojedinačnih čvorova i mreže u cjelini. Čak možete, ako je potrebno, podijeliti mrežu na dijelove unutar jednog projekta na temelju određenih kriterija, smanjujući ukupno opterećenje.
Dakle, storacle koristi mehanizam za organizaciju mreže. Ključne značajke:
- Datoteke se mogu dodati u repozitorij putem bilo kojeg čvora.
- Datoteke se spremaju kao cjeline, a ne u blokovima.
- Svaka datoteka ima svoj jedinstveni hash svog 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 na mreži ograničen je mogućnostima širenja broja dopuštenih čvorova na mreži, koja će u drugoj verziji moći raditi s beskonačnim brojem čvorova (više o tome u drugom članku).
Jednostavan primjer kako ovo 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
Nema ništa posebno. Informacije o broju datoteka, njihovoj ukupnoj veličini i drugim detaljima pohranjene su u bazi podataka u memoriji i ažuriraju se kada se datoteke brišu i dodaju, tako da nema potrebe za čestim pristupom datotečnom sustavu. Iznimka je omogućavanje sakupljanja smeća, koje zahtijeva rotaciju datoteka kada se dosegne određena veličina pohrane, umjesto sprječavanja novih dodavanja. U ovom slučaju, pohrana se mora proći, a rukovanje velikim brojem datoteka (recimo, preko milijun) može dovesti do značajnog opterećenja. Bolje je pohraniti manje datoteka i pokrenuti više čvorova. Ako je sakupljač smeća onemogućen, ovaj problem se ne pojavljuje.
Pohrana datoteka sastoji se od 256 mapa i dvije razine ugniježđivanja. Datoteke se pohranjuju u mapama druge razine. To znači da ako postoji milijun datoteka, svaka mapa će sadržavati približno 62 500 (1 000 000 / sqrt(256)).
Imena mapa formiraju se iz hash-a datoteke tako da im se može brzo pristupiti znajući hash.
Ova struktura je odabrana na temelju velikog broja različitih zahtjeva za pohranu: podrška za slabe datotečne sustave, gdje je nepoželjno imati mnogo datoteka u jednoj mapi, brzi obilazak svih mapa kada je to potrebno itd. Svojevrsna zlatna sredina.
predmemoriranje
Prilikom dodavanja datoteka, kao i prilikom njihovog primanja, poveznice na datoteke zapisuju se u predmemoriju.
To često eliminira potrebu za prelaskom cijele mreže kako bi se pronašla datoteka. To ubrzava dohvaćanje poveznica i smanjuje opterećenje mreže. Predmemoriranje se također događa putem HTTP zaglavlja.
Izomorfizam
Klijent je napisan u JavaScriptu i izomorfan je, može se koristiti izravno iz preglednika.
Možete prenijeti datoteku kao skriptu i dobiti pristup window.ClientStoracle ili uvoz putem sustava za izgradnju itd.
Odgođene veze
Još jedna zanimljiva značajka je "odgođena poveznica". To je poveznica na datoteku koja se može sinkronizirano dohvatiti, ovdje i sada, a datoteka će se dohvatiti nakon što se pronađe u pohrani. To je vrlo praktično kada, na primjer, trebate prikazati neke slike na web stranici. Jednostavno dodajte odgođenu poveznicu u src i to je to. Postoji mnogo slučajeva upotrebe koje možete smisliti.
Klijentski API
- async Klijent.prototip.storeFile() - spremanje datoteke
- async Klijent.prototip.getFileLink() - dobivanje izravne poveznice na datoteku
- async Klijent.prototip.getFileLinks() - dobivanje popisa izravnih poveznica na datoteku sa svih čvorova gdje se ona nalazi
- async Client.prototype.getFileToBuffer() — spremiti datoteku u međuspremnik
- async Client.prototype.getFileToPath() — ubaciti datoteku u datotečni sustav
- async Client.prototype.getFileToBlob() — dohvati datoteku u blobu (za verziju preglednika)
- async Klijent.prototip.ukloniDatoteku() - izbrisati datoteku
- Client.prototype.createRequestedFileLink() - stvorite odgođenu vezu
Izvoz datoteka na drugi poslužitelj
Za prijenos datoteka 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. Međutim, u ovom slučaju, morat ćete pokrenuti funkciju jednom. node.normalizeFilesInfo()ponovno izračunati sve podatke i unijeti ih u bazu podataka.
- Koristite funkciju node.exportFiles(), što će započeti kopiranje datoteka.
Osnovne postavke čvora
Prilikom pokretanja čvora za pohranu možete odrediti sve potrebne postavke.
Opisat ću najosnovnije, ostale možete pronaći na GitHubu.
- storage.dataSize — veličina mape s datotekama
- storage.tempSize — veličina privremene mape
- storage.autoCleanSize — minimalna veličina pohrane koju treba održavati. Ako navedete ovaj parametar, najmanje korištene datoteke bit će izbrisane čim prostor postane nedovoljan.
- datoteka.maxSize — maksimalna veličina datoteke
- file.minSize — minimalna veličina datoteke
- datoteka.preferredDuplicates — željeni broj duplikata datoteka na mreži
- datoteka.mimeBijela lista — prihvatljive vrste datoteka
- file.mimeCrna lista - nevažeće vrste datoteka
- datoteka.extBijela lista — prihvatljive ekstenzije datoteka
- datoteka.extCrna lista - nevažeće ekstenzije datoteka
- datoteka.linkCache - razne postavke predmemoriranja poveznica
Gotovo svi parametri vezani uz dimenzije mogu se specificirati i u apsolutnim i u relativnim vrijednostima.
Rad putem komandne linije
Biblioteka se može koristiti putem naredbenog retka. Da biste to učinili, instalirajte je globalno: npm i-g pohranaNakon toga možete pokrenuti potrebne radnje iz direktorija projekta u kojem se nalazi čvor. Na primjer, pohrana -a pohranaDatoteka -f ./datoteka.txt -c ./config.jsza dodavanje datoteke. Sve radnje možete pronaći u
Zašto bi vam ovo moglo trebati?
- Ako želite stvoriti decentralizirani projekt koji vam omogućuje pohranu i upravljanje datotekama pomoću prikladnih metoda. Na primjer, glazbeni projekt opisan u poveznici na početku članka koristi skladište.
- Ako radite na bilo kojim drugim projektima koji zahtijevaju distribuiranu pohranu datoteka, možete jednostavno izgraditi vlastitu privatnu mrežu, fleksibilno konfigurirati čvorove i dodavati nove po potrebi.
- Ako vam je potrebno samo mjesto za pohranu datoteka vaše web stranice i ne možete se zamarati time da sve sami pišete, ova biblioteka bi mogla bolje odgovarati vašim potrebama.
- Ako imate projekt u kojem radite s datotekama, ali želite sve manipulacije obavljati iz preglednika, možete izbjeći pisanje koda na strani poslužitelja.
Moji kontakti:
Izvor: www.habr.com
