
Ier ech ufänken, muss ech fort sou datt kloer ass, vu wat mer genee schwätzen.
An dësem Artikel wëll ech d'Schicht kucken, déi verantwortlech ass fir Dateien ze späicheren, a wéi et vu jidderengem benotzt ka ginn. , et gëtt keng direkt Verbindung mat Musek. Dir kënnt d'Späichere vun all Dateien organiséieren.
Am viregten Artikel hunn ech "d'Faass" e bëssen weider gerullt ipfs, mee dat ass genee geschitt am Kontext vum Problem deen ech geléist hunn. Am Allgemengen, mengen ech, datt dëse Projet cool ass. Ech léiwer just d'Fäegkeet fir verschidde Netzwierker fir verschidden Aufgaben ze kreéieren. Dëst erlaabt Iech d'Struktur besser z'organiséieren an d'Laascht op eenzel Wirbelen an d'Netzwierk als Ganzt ze reduzéieren. Och am Kader vun engem Projet, wann néideg, kënnt Dir d'Netzwierk a Stécker no e puer Critèren opdeelen, d'Gesamtlaascht reduzéieren.
Also Storacle benotzt de Mechanismus fir d'Organisatioun vun engem Netzwierk. Schlëssel Features:
- Dateien kënnen an de Repository iwwer all Node bäigefüügt ginn.
- Dateien gi ganz gespäichert, net a Blocken.
- All Datei huet säin eegene eenzegaartegen Inhaltshash fir weider ze schaffen.
- Dateie kënnen duplizéiert ginn fir méi Zouverlässegkeet
- D'Zuel vun de Dateien op engem Node ass nëmme vum Dateiesystem limitéiert (et gëtt eng Ausnahm, méi doriwwer hei ënnen)
- D'Zuel vun de Fichieren am Netz ass limitéiert duerch d'Verbreedungsfäegkeeten no der Unzuel vu gültege Wirbelen am Netz, déi an der zweeter Versioun fäeg sinn mat enger onendlecher Unzuel vu Wirbelen ze schaffen (méi doriwwer an engem aneren Artikel)
En einfacht Beispill vu wéi dëst allgemeng aus dem Programm funktionnéiert:
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);
}
})();
Client:
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);
}
})();
Bannenzeg Vue
Et gëtt näischt ausgefalene ënnert der Hood. Informatioun iwwer d'Zuel vun de Fichieren, hir Gesamtgréisst an aner Punkte ginn an enger In-Memory-Datebank gespäichert a ginn aktualiséiert wann Dateie geläscht a bäigefüügt ginn, sou datt et net néideg ass dacks op de Dateiesystem ze kommen. Eng Ausnam ass den Drecksammel z'aktivéieren wann Dir Dateien zirkuléiere musst wann eng gewësse Späichergréisst erreecht gëtt, an net verbidden neier derbäizesetzen. An dësem Fall musst Dir d'Späichere ëmgoen, a mat enger grousser Zuel vu Fichieren (> soen eng Millioun) ze schaffen kann zu bedeitende Laaschte féieren. An et ass besser manner Dateien ze späicheren a méi Noden ze lafen. Wann de "Cleaner" behënnert ass, da gëtt et kee sou Problem.
D'Dateispäicherung besteet aus 256 Classeure an 2 Nistniveauen. Dateien ginn an zweeten Niveau Classeure gespäichert. Dat heescht, wann et 1 Mio. Et ginn ongeféier 62500 Dateien an all esou Dossier (1000000 / sqrt(256)).
D'Dossiernimm ginn aus dem Dateihash geformt, sou datt Dir séier Zougang kënnt wann Dir den Hash kennt.
Dës Struktur gouf gewielt baséiert op enger grousser Zuel vu verschiddene Späicherfuerderungen: Ënnerstëtzung fir schwaach Dateiesystemer, wou et net wënschenswäert ass, vill Dateien an engem Dossier ze hunn, séier Traversal vun all Ordner wann néideg, etc. Eng Aart vu gëllene Mëttel.
cachen
Wann Dir Dateien bäidréit, wéi och wann se se kréien, ginn Linken op Dateien an de Cache geschriwwe.
Dank dësem, ganz dacks ass et net néideg fir de ganze Netz op der Sich no enger Datei ze duerchbriechen. Dëst beschleunegt d'Empfang vu Linken a reduzéiert d'Laascht um Netz. Caching geschitt och iwwer http Header.
Isomorphie
De Client ass a Javascript geschriwwen an ass isomorphesch, et kann direkt vum Browser benotzt ginn.
Dir kënnt de Fichier eropluede als Schrëft an Zougang Fënster.ClientStoracle oder importéieren duerch de Build System, etc.
Deferred Links
Eng interessant Feature ass och de "deferred link". Dëst ass e Link op eng Datei déi synchron hei an elo ka kréien, an d'Datei gëtt eropgezunn wann se schonn an der Späichere fonnt gëtt. Dëst ass ganz bequem wann Dir zum Beispill e puer Biller um Site muss weisen. Mir setzen just e verstoppte Link an src an dat ass et. Dir kënnt mat ville Fäll kommen.
Client API
- async Client.prototype.storeFile() - d'Datei späicheren
- async Client.prototype.getFileLink() - en direkten Link op d'Datei kréien
- async Client.prototype.getFileLinks() - eng Lëscht vun direkten Linken op eng Datei aus all Noden ze kréien wou et existéiert
- async Client.prototype.getFileToBuffer() - kritt d'Datei an de Puffer
- async Client.prototype.getFileToPath() - eng Datei an de Dateiesystem kréien
- async Client.prototype.getFileToBlob() - kritt d'Datei a Blob (fir Browser Versioun)
- async Client.prototype.removeFile() - läschen eng Datei
- Client.prototype.createRequestedFileLink() - erstellt e verstoppte Link
Export Dateien op en anere Server
Fir Dateien op en aneren Node ze transferéieren, kënnt Dir:
- Kopie Just de ganze Stockage Dossier zesumme mat den Astellungen. (dëst funktionnéiert vläicht net an Zukunft)
- Kopéiert nëmmen den Dossier mat Dateien. Awer an dësem Fall musst Dir d'Funktioun eemol ausféieren node.normalizeFilesInfo()fir all d'Donnéeën nei ze berechnen an an d'Datebank anzeginn.
- Benotzt Funktioun node.exportFiles()déi ufänken Dateien ze kopéieren.
Basis Node Astellunge
Wann Dir de Späicherknuet ufänkt, kënnt Dir all déi néideg Astellunge spezifizéieren.
Ech wäert déi meescht Basis beschreiwen, de Rescht kann op Github fonnt ginn.
- storage.dataSize - Gréisst vum Dossier mat Dateien
- storage.tempSize - temporär Dossiergréisst
- storage.autoCleanSize - d'Mindestlagergréisst déi gehale muss ginn. Wann Dir dëse Parameter spezifizéiert, da soubal de Raum ufänkt ze lafen, ginn déi mannst benotzte Dateien geläscht.
- file.maxSize - maximal Dateigréisst
- file.minGréisst - Minimum Dateigréisst
- file.preferredDuplicates - bevorzugt Zuel vun Dateiduplikaten am Netz
- file.mimeWhitelist - valabel Dateitypen
- file.mimeBlacklist - ongëlteg Dateitypen
- file.extWhitelist - valabel Dateierweiterungen
- file.extBlacklist - ongëlteg Dateierweiterungen
- file.linkCache - verschidde Link Caching Astellunge
Bal all Parameteren am Zesummenhang mat Dimensiounen kënnen an absoluten a relativen Wäerter agefouert ginn.
Schafft iwwer d'Kommandozeil
D'Bibliothéik kann iwwer d'Kommandozeil benotzt ginn. Fir dëst ze maachen, musst Dir et weltwäit installéieren: npm i -g Lager. Duerno kënnt Dir déi néideg Aktiounen aus dem Projetsverzeechnes starten wou den Node ass. Zum Beispill, storacle -a storeFile -f ./file.txt -c ./config.jsfir de Fichier dobäizemaachen. All Aktiounen kënnen an
Firwat kéint Dir dëst brauchen?
- Wann Dir eng Aart dezentraliséierte Projet wëllt erstellen an deem Dir plangt mat Dateien ze späicheren a mat praktesche Methoden ze schaffen. Zum Beispill benotzt de Museksprojet am Link am Ufank vum Artikel beschriwwen Stockage.
- Wann Dir un all aner Projete schafft, wou Dir Dateien op eng verdeelt Manéier späichere musst. Dir kënnt Äert zouenen Netzwierk einfach bauen, flexibel Wirbelen konfiguréieren an nei addéieren wann néideg.
- Wann Dir just Är Websäit Dateien iergendwou muss späicheren an et ass ze vill fir Iech alles selwer ze schreiwen. Vläicht ass dës Bibliothéik besser wéi anerer an Ärem Fall.
- Wann Dir e Projet hutt an deem Dir mat Dateien schafft, awer wëllt all Manipulatioune vum Browser ausféieren. Dir kënnt vermeiden Servercode ze schreiwen.
Meng Kontakter:
Source: will.com
