
Mielőtt elkezdeném, meg kell osztanom , hogy érthető legyen, miről is van szó.
Ebben a cikkben egy olyan réteget szeretnék megvitatni, amely a fájlok tárolásáért felelős, és hogy ezt bárki hogyan használhatja. , amelynek nincs közvetlen kapcsolata a zenével. Bármilyen fájl tárolására alkalmas.
A korábbi cikkben kicsit "kielégítettem" a ipfs, de ez pontosan a megoldott feladat kontextusában történt. Összességében jónak tartom ezt a projektet. Egyszerűen jobban szeretem a lehetőséget, hogy különböző hálózatokat hozhatok létre különböző feladatokhoz. Ez lehetővé teszi a struktúra jobb szervezését, és csökkenti az egyes csomópontok és az egész hálózat terhelését. Még egy adott projekt keretein belül is szükség szerint fel lehet osztani a hálózatot részekre valamilyen kritérium alapján, csökkentve ezzel az összterhelést.
Tehát a Storacle a mechanizmusát használja a hálózat szervezéséhez. Főbb jellemzők:
- A fájlok bármely csomóponton keresztül hozzáadhatók a tároláshoz.
- A fájlok teljes egészében, nem blokkokban kerülnek mentésre.
- Minden fájlnak van egyedi hash kódja a tartalma alapján a további munkához.
- A fájlok megduplázhatók a megbízhatóság növelése érdekében.
- A fájlok száma egy csomóponton csak a fájlrendszer korlátaitól függ (a kivételeket később érintem).
- A fájlok száma a hálózatban a spreadable által kezelt csomópontok maximális számához van korlátozva, amelyek a második verzióban lehetővé teszik a végtelen számú csomóponttal való munkát (erről egy másik cikkben lesz szó).
Egyszerű példa, hogyan működik ez 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);
}
})();Kliens:
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);
}
})();Belső nézet
A háttérben nincs semmi különös. A fájlok számáról, a fájlok összesített méretéről és egyéb tényezőkről in-memory adatbázisban tárolódik, és frissülnek fájlok törlésekor és hozzáadásakor, így nem szükséges gyakran a fájlrendszerhez fordulni. Kivételt jelent a szemétgyűjtő bekapcsolása, amikor fájlok cirkulálására van szükség valamilyen tárolási méret elérésekor, és nem új fájlok hozzáadásának tilalmára. Ilyen esetben körbe kell nézni a tárolón, és a nagy mennyiségű fájl kezelése (> egy millió, mondjuk) jelentős terhelést okozhat. Jobb, ha kevesebb fájlt tárolunk, és több csomópontot indítunk. Ha a "tisztító" ki van kapcsolva, akkor ilyen probléma nem merül fel.
A fájltároló 256 mappából és 2 szint mélységből áll. A fájlok a második szintű mappákban tárolódnak. Tehát ha 1 millió fájl van, akkor minden ilyen mappában körülbelül 62500 fájl lesz (1000000 / sqrt(256)).
A mappák neve a fájl hash-jéből képződik, így gyorsan hozzáférhetünk, ha tudjuk a hash-t.
Ez a struktúra a tárolóval szembeni különböző követelmények alapján lett kiválasztva: gyenge fájlrendszerek támogatása, ahol egy mappában nem lenne kívánatos sok fájlt tárolni, a mappák gyors átvizsgálása szükség esetén, stb. Ez egyfajta arany középút.
Gyorsítótárazás
Fájlok hozzáadása és lekérésekor a fájlok hivatkozásai a gyorsítótárba kerülnek.
Ennek köszönhetően gyakran nem szükséges az egész hálózatot átkutatni a fájl kereséséhez. Ez felgyorsítja a hivatkozások elérését és csökkenti a hálózati terhelést. A gyorsítótárazás http fejlécen keresztül is történik.
Izomorfizmus
A kliens JavaScript nyelven íródott és izomorf, közvetlenül a böngészőből is használható.
Fájl feltöltése lehetséges mint szkript, és hozzáférést nyerhetünk a window.ClientStoracle vagy importálhatjuk a build rendszerén keresztül, stb.
Halasztott hivatkozások
Érdekes funkció a "halasztott hivatkozás". Ez egy hivatkozás egy fájlra, amelyet szinkron módon, itt és most lehet megszerezni, míg a fájl a tárolóból csak később kerül elő, amikor már megtalálható. Ez nagyon praktikus, például amikor a weboldalon bizonyos képeket kell megjeleníteni. Egyszerűen a src attribútumban megadjuk a halasztott hivatkozást, és kész. Számos esettanulmányt ki lehet találni.
Kliens API
- async Client.prototype.storeFile() — fájl mentése
- async Client.prototype.getFileLink() — közvetlen hivatkozás a fájlhoz
- async Client.prototype.getFileLinks() — a fájl közvetlen hivatkozásainak listájának megszerzése az összes csomóponton, ahol elérhető
- async Client.prototype.getFileToBuffer() — fájl megszerzése a puffertárba
- async Client.prototype.getFileToPath() — fájl megszerzése a fájlrendszerbe
- async Client.prototype.getFileToBlob() — fájl megszerzése blob-ba (böngésző verzióhoz)
- async Client.prototype.removeFile() — fájl törlése
- Client.prototype.createRequestedFileLink() — késleltetett hivatkozás létrehozása
Fájlok exportálása egy másik szerverre
Fájlok áthelyezéséhez egy másik csomópontra:
- Egyszerűen másolja át a tároló mappát a beállításokkal együtt. (a jövőben ez nem biztos, hogy működni fog)
- Csak a fájlokat tartalmazó mappát másolja át. De ebben az esetben egyszer indítania kell a funkciót node.normalizeFilesInfo(), hogy újraszámolja az összes adatot és bejegyezze az adatbázisba.
- Használja a funkciót node.exportFiles(), amely megkezdi a fájlok másolását.
A csomópont fő beállításai
A tároló csomópont indításakor megadhatja az összes szükséges beállítást.
A legfontosabbakat bemutatom, a többi a GitHubon található.
- storage.dataSize — a fájlok mappa mérete
- storage.tempSize — a temporális mappa mérete
- storage.autoCleanSize — a tárolónak megtartandó minimális mérete. Ha ezt a paramétert megadja, akkor amint a hely kezd hiányozni, a legkevésbé használt fájlok törlésre kerülnek.
- file.maxSize — a fájl maximális mérete
- file.minSize — a fájl minimális mérete
- file.preferredDuplicates — a fájl preferált másolatainak száma a hálózatban
- file.mimeWhitelist — megengedett fájltípusok
- file.mimeBlacklist — tiltottnak számító fájltípusok
- file.extWhitelist — megengedett fájl kiterjesztések
- file.extBlacklist — tiltottnak számító fájl kiterjesztések
- file.linkCache — hivatkozási gyorsítótárazási beállítások
Szinte az összes, mérettel kapcsolatos paramétert meg lehet adni abszolút és relatív mértékegységekben is.
Parancssoron keresztüli használat
A könyvtár a parancssoron keresztül is használható. Ehhez globálisan kell telepíteni: npm i -g storacle. Ezután a szükséges akciókat a projekttel rendelkező könyvtárból indíthatja. Például storacle -a storeFile -f ./file.txt -c ./config.js, hogy fájlt adjunk hozzá. Minden akció megtalálható a
Miért lehet szükséged erre
- Ha olyan decentralizált projektet szeretnél létrehozni, amelyben fájlokat tervezel tárolni és kezelni kényelmes módszerekkel. Például a cikk elején található zenei projekt storacle.
- Ha bármilyen más projekten dolgozol, ahol fájlokat kell elosztva tárolni. Könnyedén létrehozhatod a saját zárt hálózatodat, rugalmasan beállíthatod a csomópontokat, és újakat adhatsz hozzá, amikor szükséges.
- Ha csak annyira van szükséged, hogy valahol tárold a weboldalad fájljait, és nem akarsz mindent magad megírni. Lehetséges, hogy ez a könyvtár jobban illik a te esetedhez, mint mások.
- Ha van egy projekted, amelyben fájlokkal dolgozol, de szeretnéd az összes műveletet a böngészőből végezni. Elkerülheted a szerveroldali kód írását.
Az elérhetőségeim:
Forrás: habr.com
