
Voordat ik begin, moet ik , om duidelijk te maken waar het precies over gaat.
In dit artikel wil ik de laag bespreken die verantwoordelijk is voor het opslaan van bestanden, en hoe dit door iedereen kan worden gebruikt. , die geen directe verbinding met muziek heeft. Het is mogelijk om verschillende bestanden op te slaan.
In het vorige artikel heb ik een beetje "gekritiseerd" over ipfs, maar dat gebeurde precies in de context van het probleem dat ik aan het oplossen was. Over het algemeen vind ik dit project geweldig. Ik hou gewoon meer van de mogelijkheid om verschillende netwerken voor verschillende taken te creëren. Dit maakt het mogelijk om de structuur beter te organiseren en de belasting op afzonderlijke knooppunten en het netwerk als geheel te verminderen. Zelfs binnen één project kan het nodig zijn om het netwerk op te splitsen in stukken op basis van bepaalde criteria, waardoor de totale belasting wordt verminderd.
Dus, storacle gebruikt een mechanisme voor het organiseren van het netwerk. Belangrijkste kenmerken:
- Bestanden kunnen via elk knooppunt aan de opslag worden toegevoegd.
- Bestanden worden in hun geheel opgeslagen, niet in blokken.
- Elk bestand heeft zijn eigen unieke hash op basis van de inhoud voor verder gebruik.
- Bestanden kunnen worden gedupliceerd voor meer betrouwbaarheid
- Het aantal bestanden op één knooppunt is alleen beperkt door het bestandssysteem (er is een uitzondering, daarover verderop meer)
- Het aantal bestanden in het netwerk is beperkt door de mogelijkheden van spreadable wat betreft het aantal toegestane knooppunten in het netwerk, die in de tweede versie in staat zullen zijn om met een oneindig aantal knooppunten te werken (hierover in een ander artikel)
Een eenvoudig voorbeeld van hoe dit eigenlijk werkt vanuit het programma:
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);
}
})();Klant:
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);
}
})();Een blik van binnenuit
Onder de motorkap is er niets bovennatuurlijk. Informatie over het aantal bestanden, hun totale grootte en andere details worden opgeslagen in een in-memory database en worden bijgewerkt bij het verwijderen en toevoegen van bestanden, waardoor er geen noodzaak is om vaak naar het bestandssysteem te verwijzen. Een uitzondering is de inschakeling van de garbage collector, wanneer bestandscirculatie nodig is bij het bereiken van bepaalde opslaggroottes, en niet het verbod op het toevoegen van nieuwe bestanden. In dat geval moet het opslagmedium worden doorzocht, en werken met een groot aantal bestanden (> een miljoen bijvoorbeeld) kan leiden tot aanzienlijke belasting. Het is beter om minder bestanden op te slaan en meer knooppunten te draaien. Als de 'opruimer' is uitgeschakeld, is er dit probleem niet.
Het bestandsopslag bestaat uit 256 mappen en 2 niveaus van diepte. Bestanden worden opgeslagen in de mappen van de tweede laag. Dus bij 1 miljoen bestanden zal er in elke dergelijke map ongeveer 62500 zitten (1000000 / sqrt(256)).
De namen van de mappen zijn gevormd uit de hash van het bestand, zodat men snel toegang kan krijgen, als men de hash kent.
Deze structuur is gekozen op basis van de vele verschillende eisen aan de opslag: ondersteuning van zwakke bestandssystemen, waar het niet wenselijk is om veel bestanden in één map te hebben, snelle doorloop van alle mappen indien nodig, enzovoorts. Een soort gouden middenweg.
Caching
Bij het toevoegen van bestanden, evenals bij het ophalen ervan, worden links naar bestanden in de cache opgeslagen.
Hierdoor is het vaak niet nodig om het hele netwerk door te zoeken naar een bestand. Dit versnelt het verkrijgen van links en vermindert de belasting op het netwerk. Ook vindt caching plaats via http-headers.
Isomorfisme
De client is geschreven in JavaScript en is isomorfisch, hij kan rechtstreeks vanuit de browser worden gebruikt.
Een bestand kan worden geüpload als script en toegang krijgen tot window.ClientStoracle of geïmporteerd worden via een build-systeem, enzovoort.
Uitgestelde links
Een interessante functie is ook de 'uitgestelde link'. Dit is een link naar een bestand die synchronisch kan worden verkregen, hier en nu, en het bestand wordt opgetrokken wanneer het in de opslag is gevonden. Dit is erg handig, bijvoorbeeld als je bepaalde afbeeldingen op een website wilt tonen. Gewoon de uitgestelde link in src plaatsen en klaar. Er zijn veel scenario's te bedenken.
Client API
- async Client.prototype.storeFile() — bestand opslaan
- async Client.prototype.getFileLink() — verkrijg directe link naar bestand
- async Client.prototype.getFileLinks() — het verkrijgen van een lijst met directe links naar het bestand vanaf alle knooppunten waar het aanwezig is
- async Client.prototype.getFileToBuffer() — om het bestand in de buffer te krijgen
- async Client.prototype.getFileToPath() — om het bestand in het bestandssysteem te krijgen
- async Client.prototype.getFileToBlob() — om het bestand in een blob (voor de browserversie) te krijgen
- async Client.prototype.removeFile() — bestand verwijderen
- Client.prototype.createRequestedFileLink() — een uitgestelde link maken
Bestanden naar een andere server exporteren
Om bestanden naar een ander knooppunt te verplaatsen, kun je:
- Gewoon de hele opslagmap kopiëren, samen met de instellingen. (dit kan in de toekomst niet werken)
- Alleen de map met bestanden kopiëren. Maar in dit geval moet je de functie node.normalizeFilesInfo(), één keer uitvoeren om alle gegevens te herberekenen en in de database op te nemen.
- Gebruik de functie node.exportFiles(), die met het kopiëren van bestanden begint.
Belangrijkste knooppuntinstellingen
Bij het starten van het opslagknooppunt kun je alle benodigde instellingen opgeven.
Ik zal de belangrijkste beschrijven, de rest is te vinden op GitHub.
- storage.dataSize — de grootte van de map met bestanden
- storage.tempSize — de grootte van de tijdelijke map
- storage.autoCleanSize — de minimale opslaggrootte die moet worden behouden. Als je deze parameter opgeeft, zullen de minst gebruikte bestanden worden verwijderd zodra de ruimte begint op te raken.
- file.maxSize — de maximale bestandsgrootte
- file.minSize — de minimale bestandsgrootte
- file.preferredDuplicates — het gewenste aantal duplicaten van het bestand in het netwerk
- file.mimeWhitelist — toegestane bestandstypen
- file.mimeBlacklist — niet-toegestane bestandstypen
- file.extWhitelist — toegestane bestandovergangen
- file.extBlacklist — niet-toegestane bestandovergangen
- file.linkCache — verschillende instellingen voor linkcache
Bijna alle parameters met betrekking tot afmetingen kunnen zowel in absolute als in relatieve eenheden worden ingesteld.
Werken via de opdrachtregel
De bibliotheek kan worden gebruikt via de opdrachtregel. Om dit te doen, moet je het globaal installeren: npm i -g storacle. Daarna kun je de benodigde acties uitvoeren vanuit de projectdirectory, waar het knooppunt zich bevindt. Bijvoorbeeld, storacle -a storeFile -f ./file.txt -c ./config.js, om een bestand toe te voegen. Alle acties zijn te vinden in
Waarom heb je dit nodig
- Als je een gedecentraliseerd project wilt creëren waarin bestandshantering op handige manieren is gepland. Bijvoorbeeld, het muziekproject, beschreven in de link aan het begin van het artikel, gebruikt storacle.
- Als je aan andere projecten werkt waarbij je bestanden gedistribueerd moet opslaan, kun je eenvoudig je eigen gesloten netwerk opzetten, met flexibele knooppunten die je kunt aanpassen en nieuwe kunt toevoegen wanneer dat nodig is.
- Als je gewoon ergens de bestanden van je website wilt opslaan en je hebt geen zin om alles zelf te schrijven, dan is deze bibliotheek misschien geschikter dan andere in jouw geval.
- Als je een project hebt waarbij je met bestanden werkt, maar je wilt alle handelingen vanuit de browser uitvoeren, kun je servercode vermijden.
Mijn contactgegevens:
Bron: habr.com
