
Bevor ich anfange, muss ich , damit klar wird, worum es genau geht.
In diesem Artikel möchte ich die Schicht besprechen, die fĂŒr die Speicherung von Dateien verantwortlich ist, und wie dies von jedem genutzt werden kann. , die in keiner direkten Verbindung zur Musik steht. Es können beliebige Dateien gespeichert werden.
Im vorherigen Artikel habe ich ein wenig "Dampf abgelassen" ĂŒber ipfs, aber das geschah genau im Kontext der Aufgabe, die ich gelöst habe. Insgesamt halte ich dieses Projekt fĂŒr groĂartig. Mir gefĂ€llt einfach die Möglichkeit, unterschiedliche Netzwerke fĂŒr verschiedene Aufgaben zu erstellen. Das ermöglicht eine bessere Organisation der Struktur und verringert die Belastung einzelner Knoten und des Netzwerks insgesamt. Man kann sogar innerhalb eines bestimmten Projekts, wenn nötig, das Netzwerk nach bestimmten Kriterien in StĂŒcke aufteilen, um die gesamte Belastung zu reduzieren.
Also nutzt storacle den Mechanismus zur Organisation des Netzwerks. Die Hauptmerkmale sind:
- Dateien können ĂŒber jeden Knoten in den Speicher hinzugefĂŒgt werden.
- Dateien werden vollstÀndig gespeichert, nicht in Blöcken.
- Jede Datei hat ihren einzigartigen Hash basierend auf dem Inhalt fĂŒr die weitere Bearbeitung.
- Dateien können zur Erhöhung der ZuverlÀssigkeit dupliziert werden.
- Die Anzahl der Dateien auf einem Knoten ist nur durch das Dateisystem begrenzt (es gibt eine Ausnahme, die weiter unten erlÀutert wird)
- Die Anzahl der Dateien im Netzwerk ist durch die Möglichkeiten spreadable hinsichtlich der Anzahl der zulĂ€ssigen Knoten im Netzwerk begrenzt, die in der zweiten Version die Arbeit mit einer unbegrenzten Anzahl von Knoten ermöglichen können (darĂŒber in einem anderen Artikel).
Ein einfaches Beispiel, wie das Ganze aus dem Programm funktioniert:
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);
}
})();Ein Blick von innen
Unter der Haube gibt es nichts ĂbernatĂŒrliches. Informationen zur Anzahl der Dateien, deren Gesamtspeicherplatz und andere Aspekte werden in einer In-Memory-Datenbank gespeichert und bei der Löschung und HinzufĂŒgung von Dateien aktualisiert, sodass es nicht erforderlich ist, hĂ€ufig auf das Dateisystem zuzugreifen. Eine Ausnahme bildet das Einschalten des Garbage Collectors, wenn eine Zirkulation der Dateien erforderlich ist, sobald bestimmte SpeichergröĂen erreicht werden, anstatt neue HinzufĂŒgungen zu blockieren. In diesem Fall muss das Speicherwerk durchlaufen werden, und die Arbeit mit einer groĂen Anzahl von Dateien (> eine Million, sagen wir) kann zu erheblichen Belastungen fĂŒhren. Es ist besser, weniger Dateien zu speichern und mehr Knoten zu starten. Wenn der âCleanerâ deaktiviert ist, gibt es kein solches Problem.
Das Dateispeicherwerk besteht aus 256 Ordnern und 2 Ebenen der Verschachtelung. Die Dateien werden in Ordnern der zweiten Ebene gespeichert. Das bedeutet, dass bei 1 Million Dateien in jedem dieser Ordner etwa 62500 liegen (1000000 / sqrt(256)).
Die Namen der Ordner werden aus dem Hash der Datei gebildet, sodass ein schneller Zugriff möglich ist, wenn der Hash bekannt ist.
Diese Struktur wurde unter BerĂŒcksichtigung zahlreicher verschiedener Anforderungen an das Speicherwerk gewĂ€hlt: UnterstĂŒtzung von schwachen Dateisystemen, bei denen es unerwĂŒnscht ist, viele Dateien in einem Ordner zu haben, schneller Zugriff auf alle Ordner bei Bedarf usw. Eine Art Mittelweg.
Caching
Beim HinzufĂŒgen von Dateien sowie beim Abrufen werden Links zu den Dateien im Cache gespeichert.
Dank dessen ist es oft nicht notwendig, das gesamte Netzwerk auf der Suche nach einer Datei zu durchsuchen. Dies beschleunigt den Erhalt der Links und reduziert die Belastung des Netzwerks. Auch die Zwischenspeicherung erfolgt ĂŒber HTTP-Header.
Isomorphie
Der Client ist in JavaScript geschrieben und ist isomorph, er kann direkt aus dem Browser verwendet werden.Â
Eine Datei kann hochgeladen werden als Skript und Zugriff auf window.ClientStoracle oder ĂŒber ein Build-System importiert werden usw.
Verzögerte Links
Eine interessante Funktion ist auch der "verzögerte Link". Dies ist ein Link zu einer Datei, der synchron hier und jetzt abgerufen werden kann, wÀhrend die Datei geladen wird, sobald sie im Speicher gefunden wird. Dies ist sehr praktisch, wenn man beispielsweise auf der Website Bilder anzeigen muss. Man setzt einfach den verzögerten Link im src ein und das war's. Es gibt viele Anwendungsmöglichkeiten.
API des Clients
- async Client.prototype.storeFile() â Datei speichern
- async Client.prototype.getFileLink() â direkten Link zur Datei abrufen
- async Client.prototype.getFileLinks() â Liste der direkten Links zur Datei von allen Knoten, an denen sie vorhanden ist
- async Client.prototype.getFileToBuffer() â Datei in den Puffer laden
- async Client.prototype.getFileToPath() â Datei im Dateisystem speichern
- async Client.prototype.getFileToBlob() â Datei im Blob speichern (fĂŒr die Browser-Version)
- async Client.prototype.removeFile() â Datei löschen
- Client.prototype.createRequestedFileLink() â verzögerten Link erstellen
Dateiexport auf einen anderen Server
Um Dateien auf einen anderen Knoten zu ĂŒbertragen, kann man:
- Einfach den gesamten Speicherordner einschlieĂlich der Einstellungen kopieren. (In Zukunft könnte das möglicherweise nicht funktionieren)
- Nur den Ordner mit den Dateien kopieren. Aber in diesem Fall muss die Funktion node.normalizeFilesInfo(), einmal ausgefĂŒhrt werden, um alle Daten neu zu berechnen und in die Datenbank einzutragen.
- Die Funktion verwenden node.exportFiles(), die mit dem Kopieren der Dateien beginnt.
Haupteinstellungen des Knotens
Beim Starten des Speicher-Knotens kann man alle erforderlichen Einstellungen angeben.
Ich werde die wichtigsten beschreiben, das Weitere findest du auf GitHub.
- storage.dataSize â GröĂe des Ordners mit Dateien
- storage.tempSize â GröĂe des temporĂ€ren Ordners
- storage.autoCleanSize â minimale GröĂe des Speichers, die aufrechterhalten werden muss. Wenn dieser Parameter angegeben wird, werden die am wenigsten genutzten Dateien gelöscht, sobald der Speicherplatz knapp wird.
- file.maxSize â maximale DateigröĂe
- file.minSize â minimale DateigröĂe
- file.preferredDuplicates â bevorzugte Anzahl an Dateidubliken im Netzwerk
- file.mimeWhitelist â zulĂ€ssige Dateitypen
- file.mimeBlacklist â unzulĂ€ssige Dateitypen
- file.extWhitelist â zulĂ€ssige Dateierweiterungen
- file.extBlacklist â unzulĂ€ssige Dateierweiterungen
- file.linkCache â verschiedene Einstellungen zum Caching von Links
Fast alle Parameter, die mit GröĂen zu tun haben, können sowohl in absoluten als auch in relativen GröĂen angegeben werden.
Arbeit ĂŒber die Eingabeaufforderung
Die Bibliothek kann ĂŒber die Eingabeaufforderung verwendet werden. Dazu muss sie global installiert werden: npm i -g storacle. Danach können die benötigten Aktionen aus dem Verzeichnis mit dem Projekt, wo der Knoten ist, gestartet werden. Zum Beispiel, storacle -a storeFile -f ./file.txt -c ./config.js, um eine Datei hinzuzufĂŒgen. Alle Aktionen sind in
Warum könnte das fĂŒr dich nĂŒtzlich sein
- Wenn du ein dezentralisiertes Projekt erstellen möchtest, in dem das Speichern und Bearbeiten von Dateien auf bequeme Weise vorgesehen ist. Zum Beispiel nutzt das Projekt mit Musik, das zu Beginn des Artikels verlinkt ist, storacle.
- Wenn du an anderen Projekten arbeitest, bei denen Dateien dezentral gespeichert werden mĂŒssen, kannst du leicht dein eigenes geschlossenes Netzwerk aufbauen, Knoten flexibel anpassen und neue hinzufĂŒgen, wann immer es nötig ist.
- Wenn du einfach nur irgendwo die Dateien deiner Website speichern musst und keine Lust hast, alles selbst zu schreiben, könnte diese Bibliothek besser fĂŒr dich geeignet sein.
- Wenn du ein Projekt hast, bei dem du mit Dateien arbeitest, aber alle Manipulationen ĂŒber den Browser durchfĂŒhren möchtest, kannst du das Schreiben von serverseitigem Code vermeiden.
Meine Kontakte:
Quelle: habr.com
