
Innan jag börjar, behöver jag lÀmna , sÄ att det Àr klart vad det handlar om.
I den hÀr artikeln skulle jag vilja gÄ igenom lagret som ansvarar för fillagring och hur detta kan anvÀndas av vem som helst. , utan nÄgon direkt koppling till musik. Man kan organisera lagring av alla typer av filer.
I den tidigare artikeln gnÀllde jag lite över ipfs, men det skedde faktiskt i kontexten av den uppgift jag sysslade med. Generellt anser jag att detta projekt Àr fantastiskt. Jag gillar bara mer möjligheten att skapa olika nÀtverk för olika uppgifter. Det gör det möjligt att bÀttre organisera strukturen och minska belastningen pÄ enskilda noder och nÀtverket som helhet. Man kan till och med inom ett specifikt projekt, vid behov, dela upp nÀtverket i segment baserat pÄ vissa kriterier för att minska den totala belastningen.
SÄ, storacle anvÀnder mekanismen för att organisera nÀtverket. Huvudfunktionerna Àr:
- Filer kan lÀggas till lagret via vilken nod som helst.
- Filer sparas i sin helhet, inte i block.
- Varje fil har sin egen unika hash baserat pÄ innehÄllet för framtida arbete med den.
- Filer kan dupliceras för högre tillförlitlighet
- Antalet filer pÄ en nod begrÀnsas endast av filsystemet (det finns ett undantag, som nÀmns lÀngre ner)
- Antalet filer i nÀtverket begrÀnsas av spridbarhet utifrÄn antalet tillÄtna noder i nÀtverket, som i den andra versionen kommer att göra det möjligt att arbeta med ett oÀndligt antal noder (om detta i en annan artikel)
Ett enkelt exempel pÄ hur detta fungerar frÄn programmet:
Servern:
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);
}
})();En inblick inifrÄn
Under the hood, thereâs nothing extraordinary. Information about the number of files, their total size, and other details are stored in an in-memory database and updated upon file addition and deletion, meaning frequent access to the file system is unnecessary. The only exception is during the activation of the garbage collector, which requires file circulation when certain storage size limits are reached, rather than a prohibition on adding new files. In this case, it is necessary to traverse the storage, and handling a large number of files (> a million, let's say) can lead to significant load. It's better to keep fewer files and run more nodes. If the 'cleaner' is disabled, this issue does not arise.
The file storage consists of 256 folders with 2 levels of nesting. Files are stored in the second-level folders. Therefore, with 1 million files, there will be about 62500 files in each folder (1000000 / sqrt(256)).
The names of the folders are generated from the file hash to enable quick access when the hash is known.
This structure was chosen based on a wide range of requirements for the storage: support for weak file systems where itâs undesirable to have many files in one folder, quick traversal of all folders when necessary, etc. It's a sort of golden mean.
Caching
When files are added or retrieved, links to the files are cached.
Thanks to this, there is often no need to traverse the entire network in search of a file. This speeds up link retrieval and reduces network load. Caching also occurs through HTTP headers.
Isomorphism
The client is written in JavaScript and isomorphic, meaning it can be used directly from the browser.Â
You can upload a file as a script and gain access to window.ClientStoracle or import through a build system, etc.
Deferred links
An interesting feature is also the 'deferred link'. This is a link to a file that can be obtained synchronously, here and now, while the file will be pulled in once it is found in storage. This is very convenient when, for instance, you need to display some images on your website. You just set the deferred link in the src and thatâs it. There are many scenarios that can be imagined.
Client API
- async Client.prototype.storeFile() â storing a file
- async Client.prototype.getFileLink() â obtaining a direct link to a file
- async Client.prototype.getFileLinks() â fĂ„ en lista över direkta lĂ€nkar till filen frĂ„n alla noder dĂ€r den finns
- async Client.prototype.getFileToBuffer() â hĂ€mta filen till en buffert
- async Client.prototype.getFileToPath() â hĂ€mta filen till filsystemet
- async Client.prototype.getFileToBlob() â hĂ€mta filen som blob (för webblĂ€sarversionen)
- async Client.prototype.removeFile() â ta bort filen
- Client.prototype.createRequestedFileLink() â skapa en uppskjuten lĂ€nk
Exportera filer till en annan server
För att överföra filer till en annan nod kan du:
- Enkelt kopiera hela lagringsmappen med instÀllningarna (detta kanske inte fungerar i framtiden)
- Kopiera endast mappen med filer. Men i sÄ fall mÄste du en gÄng köra funktionen node.normalizeFilesInfo(), för att rÀkna om alla data och lagra dem i databasen.
- AnvÀnda funktionen node.exportFiles(), som pÄbörjar kopieringen av filer.
HuvudinstÀllningar för noden
NÀr man startar lagringsnoden kan man ange alla nödvÀndiga instÀllningar.
Jag kommer att beskriva de mest grundlÀggande, resten kan hittas pÄ GitHub.
- storage.dataSize â storleken pĂ„ mappen med filer
- storage.tempSize â storleken pĂ„ temporĂ€rmappen
- storage.autoCleanSize â minimala lagringsstorlek som mĂ„ste upprĂ€tthĂ„llas. Om denna parameter anges, kommer de minst anvĂ€nda filerna att tas bort sĂ„ snart utrymmet börjar ta slut.
- file.maxSize â maximal filstorlek
- file.minSize â minimal filstorlek
- file.preferredDuplicates â önskat antal dubbletter av filen i nĂ€tverket
- file.mimeWhitelist â tillĂ„tna filtyper
- file.mimeBlacklist â otillĂ„tna filtyper
- file.extWhitelist â tillĂ„tna filĂ€ndelser
- file.extBlacklist â otillĂ„tna filĂ€ndelser
- file.linkCache â olika instĂ€llningar för lĂ€nkcache
NÀstan alla parametrar relaterade till storlekar kan anges bÄde i absoluta och relativa enheter.
Arbeta via kommandoraden
Biblioteket kan anvÀndas via kommandoraden. För detta mÄste du installera det globalt: npm i -g storacle. Efter detta kan du köra de nödvÀndiga ÄtgÀrderna frÄn katalogen med projektet dÀr noden finns. Till exempel, storacle -a storeFile -f ./file.txt -c ./config.js, för att lÀgga till en fil. Alla ÄtgÀrder kan hittas i
Varför du kan behöva detta
- Om du vill skapa ett decentraliserat projekt dÀr du planerar att lagra och arbeta med filer pÄ bekvÀma sÀtt. Till exempel, projektet med musik som beskrivs i lÀnken i början av artikeln, anvÀnder storacle.
- Om du arbetar med andra projekt dÀr du behöver lagra filer distribuerat. DÄ kan du enkelt bygga ditt privata nÀtverk, flexibelt konfigurera noder och lÀgga till nya nÀr det behövs.
- Om du bara behöver lagra filer för din webbplats och inte vill skriva allting sjÀlv. Kanske passar detta bibliotek bÀttre Àn andra i ditt fall.
- Om du har ett projekt dÀr du arbetar med filer, men vill göra alla manipulationer frÄn webblÀsaren. Du kan undvika att skriva serverkod.
Mina kontaktuppgifter:
KĂ€lla: habr.com
