
Než začnu, musím odejít , aby bylo jasné, o čem přesně mluvíme.
V tomto článku bych rád analyzoval vrstvu, která je zodpovědná za ukládání souborů, a jak ji může kdokoli používat. Neexistuje žádné přímé spojení s hudbou. Můžete si uspořádat úložiště libovolných souborů.
V předchozím článku jsem to trochu přehnal ipfs, ale stalo se to konkrétně 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 umožňuje lepší organizaci a snižuje zátěž jednotlivých uzlů a sítě jako celku. V případě potřeby můžete dokonce rozdělit síť do sekcí v rámci jednoho projektu na základě specifických kritérií, čímž se sníží celkové zatížení.
Takže Storacle používá mechanismus pro organizaci sítě. Klíčové vlastnosti:
- Soubory lze do repozitáře přidat prostřednictvím libovolného uzlu.
- Soubory se ukládají jako celky, nikoli v blocích.
- Každý soubor má svůj vlastní unikátní hash svého obsahu pro další práci s ním.
- Soubory lze pro větší spolehlivost duplikovat.
- Počet souborů na jednom uzlu je omezen pouze souborovým systémem (existuje výjimka, o té níže)
- Počet souborů v síti je omezen rozložitelnými možnostmi počtu povolených uzlů v síti, které ve druhé verzi budou schopny pracovat s nekonečným počtem uzlů (více o tom v dalším článku).
Jednoduchý příklad fungování 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 složitého. Informace o počtu souborů, jejich celkové velikosti a dalších podrobnostech jsou uloženy v databázi v paměti a aktualizují se při mazání a přidávání souborů, takže není nutné často přistupovat k souborovému systému. Výjimkou je povolení garbage collectoru, který vyžaduje rotaci souborů při dosažení určité velikosti úložiště, spíše než aby se zabránilo novým přidáním. V tomto případě je nutné úložiště procházet a zpracování velkého počtu souborů (například přes milion) může vést k významnému zatížení. Je lepší ukládat méně souborů a spouštět více uzlů. Pokud je garbage collector zakázán, tento problém nenastává.
Úložiště souborů se skládá z 256 složek a dvou úrovní vnoření. Soubory jsou uloženy ve složkách druhé úrovně. To znamená, že pokud existuje 1 milion souborů, každá složka bude obsahovat přibližně 62 500 (1 000 000 / sqrt(256)).
Názvy složek se tvoří z hashe souboru, aby k nim bylo možné rychle přistupovat, i když znají hash.
Tato struktura byla zvolena na základě velkého množství různých požadavků na úložiště: podpora slabých souborových systémů, kde je nežádoucí mít v jedné složce mnoho souborů, rychlé procházení všemi složkami v případě potřeby atd. Jakýsi zlatý střed.
ukládání do mezipaměti
Při přidávání souborů i při jejich přijímání se odkazy na soubory zapisují do mezipaměti.
Díky tomu se často eliminuje nutnost procházet celou síť, aby se našel soubor. To urychluje načítání odkazů a snižuje zatížení sítě. Ukládání do mezipaměti probíhá také prostřednictvím HTTP hlaviček.
Izomorfismus
Klient je napsán v JavaScriptu a je izomorfní, lze jej používat přímo z prohlížeče.
Můžete nahrát soubor jako skript a získat přístup k window.ClientStoracle nebo importovat přes systém sestavení atd.
Odložené odkazy
Další zajímavou funkcí je „odložený odkaz“. Jedná se o odkaz na soubor, který lze načíst synchronně, tady a teď, a soubor bude načten, jakmile bude nalezen v úložišti. To je velmi praktické, když například potřebujete zobrazit nějaké obrázky na webových stránkách. Jednoduše přidejte odložený odkaz do src a je to. Existuje mnoho případů použití, které můžete vymyslet.
Klientské API
- async Klient.prototyp.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 se nachází
- async Client.prototype.getFileToBuffer() — dostat soubor do vyrovnávací paměti
- async Client.prototype.getFileToPath() — dostat soubor do souborového systému
- async Client.prototype.getFileToBlob() — získat soubor v blobu (pro verzi prohlížeče)
- async Klient.prototyp.odstranitSoubor() - smazat soubor
- Client.prototype.createRequestedFileLink() - vytvořit odložený odkaz
Export souborů na jiný server
Chcete-li přenést soubory do jiného uzlu, můžete:
- Zkopírujte celou složku úložiště spolu s nastavením. (Toto nemusí v budoucnu 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(), čímž se spustí kopírování souborů.
Základní nastavení uzlu
Při spuštění úložného uzlu můžete zadat všechna potřebná nastavení.
Popíšu ty nejzákladnější, zbytek najdete na GitHubu.
- úložiště.dataSize — velikost složky se soubory
- úložiště.dočasná velikost — velikost dočasné složky
- storage.autoCleanSize — minimální velikost úložiště, která se má udržovat. Pokud zadáte tento parametr, nejméně používané soubory budou smazány, jakmile nebude dostatek místa.
- file.maxSize — maximální velikost souboru
- file.minSize — minimální velikost souboru
- file.preferredDuplicates — preferovaný počet duplikátů souborů v síti
- soubor.mimeWhitelist — přijatelné typy souborů
- file.mimeBlacklist - neplatné typy souborů
- soubor.extWhitelist — přijatelné přípony souborů
- soubor.extČerná listina - neplatné přípony souborů
- soubor.linkCache - různá nastavení ukládání odkazů do mezipaměti
Téměř všechny parametry související s rozměry lze zadat v absolutních i relativních hodnotách.
Práce přes příkazový řádek
Knihovnu lze použít přes příkazový řádek. Chcete-li to provést, nainstalujte ji globálně: npm i-g úložištěPoté můžete spustit potřebné akce z adresáře projektu, kde se uzel nachází. Například úložiště -a úložný_soubor -f ./soubor.txt -c ./config.jspřidat soubor. Všechny akce naleznete v
Proč byste tohle mohli potřebovat?
- Pokud chcete vytvořit decentralizovaný projekt, který vám umožní ukládat a spravovat 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, které vyžadují distribuované úložiště souborů, můžete si snadno vytvořit vlastní privátní síť, flexibilně konfigurovat uzly a podle potřeby přidávat nové.
- Pokud potřebujete jen místo pro ukládání souborů vašeho webu a nechcete se obtěžovat psát vše sami, tato knihovna by pro vaše potřeby mohla být vhodnější.
- Pokud máte projekt, kde pracujete se soubory, ale chcete provádět veškeré manipulace z prohlížeče, můžete se vyhnout psaní kódu na straně serveru.
Moje kontakty:
Zdroj: www.habr.com
