Mielőtt elkezdeném, el kell mennem
Ebben a cikkben azt a réteget szeretném megvizsgálni, amelyik a fájlok tárolásáért felelős, és hogyan használhatja bárki.
Az előző cikkben kicsit tovább „gurítottam a hordót”. ipfs, de ez pontosan az általam megoldandó probléma összefüggésében történt. Összességében szerintem ez a projekt menő. Én csak azt szeretem, ha különböző feladatokhoz különböző hálózatokat hozhatok létre. Ez lehetővé teszi a struktúra jobb megszervezését és az egyes csomópontok és a hálózat egészének terhelésének csökkentését. Egy projekt keretein belül is, ha szükséges, a hálózatot bizonyos kritériumok szerint darabokra bonthatja, csökkentve ezzel a teljes terhelést.
Tehát a Storacle a mechanizmust használja
- A fájlok bármely csomóponton keresztül hozzáadhatók a tárolóhoz.
- A fájlok teljes egészében mentésre kerülnek, nem blokkokban.
- Minden fájl saját egyedi tartalomkivonattal rendelkezik a további munkához.
- A fájlok többszörözhetők a nagyobb megbízhatóság érdekében
- Az egy csomóponton lévő fájlok számát csak a fájlrendszer korlátozza (van egy kivétel, erről bővebben alább)
- A hálózatban lévő fájlok számát a hálózatban lévő érvényes csomópontok számának megfelelő terjeszthető képességek korlátozzák, amelyek a második verzióban végtelen számú csomóponttal tudnak majd működni (erről bővebben egy másik cikkben)
Egy egyszerű példa arra, hogyan működik ez általában a programból:
Szerver:
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);
}
})();
Ügyfél:
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);
}
})();
Belülnézet
Nincs semmi elegáns a motorháztető alatt. A fájlok számával, teljes méretével és egyéb pontjaival kapcsolatos információk egy memórián belüli adatbázisban tárolódnak, és a fájlok törlésekor és hozzáadásakor frissülnek, így nincs szükség a fájlrendszer gyakori elérésére. Kivételt képez a szemétgyűjtő engedélyezése, amikor egy bizonyos tárhelyméret elérésekor a fájlokat köröztetni kell, és nem tiltja meg az újak hozzáadását. Ilyenkor ki kell kerülni a tárhelyet, és a nagyszámú (> mondjuk millió) fájllal való munka jelentős terhelésekhez vezethet. És jobb, ha kevesebb fájlt tárol, és több csomópontot futtat. Ha a "tisztító" le van tiltva, akkor nincs ilyen probléma.
A fájltároló 256 mappából és 2 beágyazási szintből áll. A fájlok a második szintű mappákban tárolódnak. Vagyis ha van 1 millió. Minden ilyen mappában körülbelül 62500 1000000 fájl lesz (256 XNUMX XNUMX / négyzetméter (XNUMX)).
A mappanevek a fájlkivonatból jönnek létre, így gyorsan hozzáférhet, ha ismeri a hash-t.
Ezt a struktúrát számos különféle tárolási követelmény alapján választottuk: gyenge fájlrendszerek támogatása, ahol nem kívánatos sok fájl egy mappában, szükség esetén az összes mappa gyors bejárása stb. Valamiféle arany középút.
gyorsítótárazás
Fájlok hozzáadásakor, valamint fogadásakor a fájlokra mutató hivatkozások a gyorsítótárba kerülnek.
Ennek köszönhetően nagyon gyakran nincs szükség a teljes hálózat bejárására egy fájl kereséséhez. Ez felgyorsítja a hivatkozások fogadását és csökkenti a hálózat terhelését. A gyorsítótárazás a http fejléceken keresztül is megtörténik.
Izomorfia
A kliens javascript nyelven íródott és izomorf, közvetlenül a böngészőből használható.
Feltöltheti a fájlt
Halasztott linkek
Érdekes funkció a „halasztott hivatkozás” is. Ez egy hivatkozás egy fájlra, amely szinkronban, itt és most beszerezhető, és a fájl akkor húzódik fel, amikor már megtalálható a tárolóban. Ez nagyon kényelmes, ha például meg kell mutatnia néhány képet az oldalon. Csak egy késleltetett hivatkozást tettünk az src-be, és ennyi. Sok esetet kitalálhatsz.
Kliens API
- aszinkron Client.prototype.storeFile() - a fájl mentése
- aszinkron Client.prototype.getFileLink() — közvetlen hivatkozás beszerzése a fájlhoz
- aszinkron Client.prototype.getFileLinks() — egy fájlra mutató közvetlen hivatkozások listája az összes csomópontból, ahol az létezik
- aszinkron Client.prototype.getFileToBuffer() - vigye be a fájlt a pufferbe
- aszinkron Client.prototype.getFileToPath() — egy fájl bevitele a fájlrendszerbe
- aszinkron Client.prototype.getFileToBlob() - töltse le a fájlt blob-ban (böngésző verzióhoz)
- aszinkron Client.prototype.removeFile() - fájl törlése
- Client.prototype.createRequestedFileLink() — késleltetett hivatkozás létrehozása
Fájlok exportálása másik szerverre
Ha fájlokat szeretne átvinni egy másik csomópontra, a következőket teheti:
- Csak másolja a teljes tárolómappát a beállításokkal együtt. (lehet, hogy ez a jövőben nem fog működni)
- Csak a fájlokat tartalmazó mappát másolja. De ebben az esetben egyszer le kell futtatnia a funkciót node.normalizeFilesInfo()az összes adat újraszámítására és az adatbázisba való beírására.
- funkció használata node.exportFiles()amely megkezdi a fájlok másolását.
Alapvető csomópont-beállítások
A tárolási csomópont indításakor minden szükséges beállítást megadhat.
A legalapvetőbbeket leírom, a többi megtalálható a Githubon.
- storage.dataSize — a fájlokat tartalmazó mappa mérete
- tárolás.tempSize — ideiglenes mappaméret
- storage.autoCleanSize — a minimális tárolási méret, amelyet el kell helyezni. Ha megadja ezt a paramétert, akkor amint a hely kezd kifogyni, a legkevésbé használt fájlok törlődnek.
- file.maxSize - maximális fájlméret
- fájl.minSize - minimális fájlméret
- file.preferredDuplicates — a fájl ismétlődéseinek preferált száma a hálózaton
- file.mimeWhitelist - érvényes fájltípusok
- file.mimeBlacklist - érvénytelen fájltípusok
- file.extWhitelist - érvényes fájlkiterjesztések
- file.extBlacklist - érvénytelen fájlkiterjesztések
- file.linkCache - Különféle link-gyorsítótárazási beállítások
Szinte minden méretekkel kapcsolatos paraméter megadható abszolút és relatív értékben is.
Munkavégzés a parancssoron keresztül
A könyvtár a parancssoron keresztül használható. Ehhez globálisan kell telepítenie: npm i -g Storacle. Ezt követően elindíthatja a szükséges műveleteket abból a projektkönyvtárból, ahol a csomópont található. Például, Storacle -a storeFile -f ./file.txt -c ./config.jsa fájl hozzáadásához. Minden művelet megtalálható a
Miért lehet erre szükséged?
- Ha valamilyen decentralizált projektet szeretne létrehozni, amelyben kényelmes módszerekkel kívánja tárolni és dolgozni a fájlokkal. Például a cikk elején található linken leírt zenei projekt használ tárház.
- Ha bármilyen más projekten dolgozik, ahol elosztott módon kell fájlokat tárolnia. Könnyedén felépítheti zárt hálózatát, rugalmasan konfigurálhatja a csomópontokat, és szükség esetén újakat is hozzáadhat.
- Ha csak el kell tárolnia a webhely fájljait valahol, és túl sok mindent maga ír meg. Talán ez a könyvtár jobban megfelel az Ön esetében, mint a többi.
- Ha van egy projektje, amelyben fájlokkal dolgozik, de minden manipulációt a böngészőből szeretne végrehajtani. Elkerülheti a szerverkód írását.
Kapcsolattartóim:
Forrás: will.com