Než začnu, musím odejít
V tomto článku bych se rád podíval na vrstvu, která je zodpovědná za ukládání souborů, a na to, jak ji může kdokoli používat.
V předchozím článku jsem trochu „převalil sud“. ipfs, ale to se stalo právě v kontextu problému, který jsem řešil. Celkově si myslím, že tento projekt je skvělý. Jen preferuji možnost vytvářet různé sítě pro různé úkoly. To vám umožní lépe organizovat strukturu a snížit zatížení jednotlivých uzlů a sítě jako celku. I v rámci jednoho projektu můžete v případě potřeby rozdělit síť na části podle určitých kritérií, čímž se sníží celkové zatížení.
Storacle tedy používá mechanismus
- Soubory lze přidávat do úložiště prostřednictvím libovolného uzlu.
- Soubory se ukládají celé, nikoli v blocích.
- Každý soubor má svůj unikátní hash obsahu pro další práci s ním.
- Pro větší spolehlivost lze soubory duplikovat
- Počet souborů na jednom uzlu je omezen pouze souborovým systémem (existuje výjimka, více níže)
- Počet souborů v síti je omezen rozšiřitelnými možnostmi podle počtu platných uzlů v síti, které ve druhé verzi budou umět pracovat s nekonečným počtem uzlů (více v jiném článku)
Jednoduchý příklad toho, jak to obecně funguje z programu:
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);
}
})();
Pohled dovnitř
Pod kapotou není nic luxusního. Informace o počtu souborů, jejich celkové velikosti a dalších bodech jsou uloženy v databázi v paměti a jsou aktualizovány při mazání a přidávání souborů, takže není potřeba často přistupovat k systému souborů. Výjimkou je povolení garbage collectoru, když potřebujete cirkulovat soubory, když je dosaženo určité velikosti úložiště, a nezakazuje přidávání nových. V tomto případě musíte obejít úložiště a práce s velkým počtem souborů (> řekněme milion) může vést k značnému zatížení. A je lepší ukládat méně souborů a provozovat více uzlů. Pokud je "čistič" vypnutý, pak takový problém neexistuje.
Úložiště souborů se skládá z 256 složek a 2 úrovní vnoření. Soubory jsou uloženy ve složkách druhé úrovně. Tedy pokud jich bude 1 milion. V každé takové složce bude asi 62500 1000000 souborů (256 XNUMX XNUMX / sqrt(XNUMX)).
Názvy složek jsou tvořeny z hash souboru, abyste k nim měli rychlý přístup, pokud znáte hash.
Tato struktura byla zvolena na základě velkého množství různých požadavků na úložiště: podpora pro slabé systémy souborů, kde není žádoucí mít mnoho souborů v jedné složce, rychlé procházení všech složek v případě potřeby atd. Nějaká zlatá střední cesta.
ukládání do mezipaměti
Při přidávání souborů i při jejich přijímání se do mezipaměti zapisují odkazy na soubory.
Díky tomu velmi často není potřeba při hledání souboru procházet celou síť. To zrychluje příjem odkazů a snižuje zatížení sítě. Ukládání do mezipaměti také probíhá prostřednictvím hlaviček http.
Izomorfie
Klient je napsán v javascriptu a je izomorfní, lze jej používat přímo z prohlížeče.
Soubor můžete nahrát
Odložené odkazy
Zajímavou funkcí je také „odložená reference“. Toto je odkaz na soubor, který lze získat synchronně, tady a teď, a soubor bude vytažen, až bude v úložišti již nalezen. To je velmi výhodné, když například potřebujete na stránce zobrazit nějaké obrázky. Prostě jsme vložili odložený odkaz do src a je to. Můžete přijít s mnoha případy.
Klientské rozhraní API
- async Client.prototype.storeFile() - uložení souboru
- async Client.prototype.getFileLink() — získání přímého odkazu na soubor
- async Client.prototype.getFileLinks() — získání seznamu přímých odkazů na soubor ze všech uzlů, kde existuje
- async Client.prototype.getFileToBuffer() — dostat soubor do vyrovnávací paměti
- async Client.prototype.getFileToPath() — získat soubor do systému souborů
- async Client.prototype.getFileToBlob() — získat soubor v blobu (pro verzi prohlížeče)
- async Client.prototype.removeFile() - smazat soubor
- Client.prototype.createRequestedFileLink() — vytvořit odložený odkaz
Exportujte soubory na jiný server
Chcete-li přenést soubory do jiného uzlu, můžete:
- Stačí zkopírovat celou složku úložiště spolu s nastavením. (v budoucnu to nemusí fungovat)
- Zkopírujte pouze složku se soubory. V tomto případě však budete muset funkci spustit jednou node.normalizeFilesInfo()přepočítat všechna data a zadat je do databáze.
- použít funkci node.exportFiles()který začne kopírovat soubory.
Základní nastavení uzlu
Při spouštění storage nodu můžete zadat všechna potřebná nastavení.
Popíšu ty nejzákladnější, zbytek najdete na Githubu.
- storage.dataSize — velikost složky se soubory
- storage.tempSize — velikost dočasné složky
- storage.autoCleanSize — minimální velikost úložiště, kterou je třeba uchovávat. Pokud zadáte tento parametr, pak jakmile začne docházet místo, budou smazány nejméně používané soubory.
- file.maxSize — maximální velikost souboru
- soubor.minVelikost — minimální velikost souboru
- file.preferredDuplicates — preferovaný počet duplicitních souborů v síti
- soubor.mimeWhitelist - platné typy souborů
- file.mimeBlacklist - neplatné typy souborů
- soubor.extWhitelist - platné přípony souborů
- file.extBlacklist - neplatné přípony souborů
- file.linkCache - různá nastavení mezipaměti odkazů
Téměř všechny parametry týkající se rozměrů lze zadávat v absolutních i relativních hodnotách.
Práce přes příkazový řádek
Knihovnu lze používat přes příkazový řádek. Chcete-li to provést, musíte jej nainstalovat globálně: npm i -g úložiště. Poté můžete spustit potřebné akce z adresáře projektu, kde je uzel. Například, storacle -a storeFile -f ./file.txt -c ./config.jspro přidání souboru. Všechny akce najdete v
Proč byste to mohli potřebovat?
- Pokud chcete vytvořit nějaký druh decentralizovaného projektu, ve kterém plánujete ukládat a pracovat se soubory pomocí pohodlných metod. Například hudební projekt popsaný v odkazu na začátku článku používá skladiště.
- Pokud pracujete na jiných projektech, kde potřebujete ukládat soubory distribuovaným způsobem. Můžete snadno budovat svou uzavřenou síť, flexibilně konfigurovat uzly a v případě potřeby přidávat nové.
- Pokud jen potřebujete někam uložit soubory webu a je pro vás příliš mnoho psát si vše sami. Možná je tato knihovna ve vašem případě vhodnější než ostatní.
- Pokud máte projekt, ve kterém pracujete se soubory, ale chcete všechny manipulace provádět z prohlížeče. Můžete se vyhnout psaní kódu serveru.
Moje kontakty:
Zdroj: www.habr.com