Leistungsoptimierung für Uploads und Downloads mit JavaScript
Wenn eine Anwendung Daten mithilfe der Azure Storage-Clientbibliothek für JavaScript überträgt, gibt es mehrere Faktoren, die sich auf die Geschwindigkeit, Speicherauslastung und sogar auf den Erfolg der Anforderung auswirken können. Um die Leistung und Zuverlässigkeit bei Datenübertragungen zu maximieren, ist es wichtig, proaktiv die Übertragungsoptionen für Clientbibliotheken basierend auf der Umgebung zu konfigurieren, in der Ihre App ausgeführt wird.
In diesem Artikel werden mehrere Überlegungen zum Optimieren von Datenübertragungsoptionen erläutert. Bei ordnungsgemäßer Optimierung kann die Clientbibliothek Daten effizient auf mehrere Anforderungen verteilen, um die Betriebsgeschwindigkeit, Arbeitsspeicherauslastung und Netzwerkstabilität zu verbessern.
Leistungsoptimierung für Uploads
Die richtige Optimierung von Datenübertragungsoptionen ist der Schlüssel für eine zuverlässige Leistung bei Uploads. Speicherübertragungen werden basierend auf den Werten dieser Argumente in mehrere Teilübertragungen unterteilt. Die maximale unterstützte Übertragungsgröße variiert je nach Vorgang und Dienstversion. Überprüfen Sie daher unbedingt die Dokumentation, um die Grenzwerte zu ermitteln. Weitere Informationen zu Grenzwerten im Zusammenhang mit Übertragungsgröße für Blob Storage finden Sie unter Skalierbarkeitsziele für Blob Storage.
Festlegen von Übertragungsoptionen für Uploads
Sie können Eigenschaften unter BlockBlobParallelUploadOptions konfigurieren, um die Leistung für Datenübertragungsvorgänge zu verbessern. In der folgenden Tabelle sind die Eigenschaften aufgeführt, die Sie konfigurieren können, zusammen mit einer Beschreibung:
Eigenschaft | Beschreibung |
---|---|
blockSize |
Die maximale Blockgröße, die für jede Anforderung im Rahmen eines Uploadvorgangs übertragen werden soll. Weitere Informationen finden Sie unter blockSize. |
maxSingleShotSize |
Wenn die Größe der Daten kleiner oder gleich diesem Wert ist, werden sie in einem einzelnen Put hochgeladen, anstatt in Blöcke aufgeteilt zu werden. Wenn die Daten in einem einzigen Vorgang hochgeladen werden, wird die Blockgröße ignoriert. Der Standardwert beträgt 256 MB. Wenn Sie diese Eigenschaft anpassen, müssen Sie einen Wert verwenden, der kleiner oder gleich 256 MB ist. Weitere Informationen finden Sie unter maxSingleShotSize. |
concurrency |
Die maximale Anzahl paralleler Anforderungen, die zu einem bestimmten Zeitpunkt im Rahmen einer einzelnen parallelen Übertragung ausgegeben werden. |
Hinweis
Sofern nicht angegeben, verwenden die Clientbibliotheken für jede Datenübertragungsoption Standardwerte. Mit diesen Standardwerten lässt sich zwar in der Regel in einer Rechenzentrumsumgebung eine hohe Leistung erzielen, für Umgebungen von Privatanwendern sind sie jedoch eher nicht geeignet. Unzureichend optimierte Datenübertragungsoptionen können zu übermäßig langen Vorgängen und sogar zu Anforderungstimeouts führen. Es empfiehlt sich, diese Werte proaktiv zu testen und dann basierend auf den Anforderungen Ihrer Anwendung und Umgebung zu optimieren.
maxSingleShotSize
Der maxSingleShotSize
-Wert ist die maximale Blobgröße in Bytes für eine einzelne Upload-Anfrage.
Wenn die Datengröße kleiner oder gleich maxSingleShotSize
ist, wird das Blob mit einer einzelnen Put Blob-Anforderung hochgeladen. Wenn die Blobgröße größer als maxSingleShotSize
oder unbekannt ist, wird das Blob mithilfe einer Reihe von Put Block-Aufrufen gefolgt von Put Block List
in Blöcken hochgeladen.
Wichtig: Der für maxSingleShotSize
definierte Wert wird nicht durch den für blockSize
angegebenen Wert eingeschränkt. Das Argument maxSingleShotSize
definiert eine separate Größenbeschränkung für eine Anforderung, um den gesamten Vorgang auf einmal (ohne Teilübertragungen) durchzuführen. maxSingleShotSize
sollte häufig mindestens so groß sein wie der für blockSize
definierte Wert. Abhängig von der Größe der Datenübertragung kann dieser Ansatz leistungsfähiger sein, da die Übertragung im Rahmen einer einzelnen Anforderung erfolgt und den mit mehreren Anforderungen verbundenen Mehraufwand vermeidet.
Sollten Sie unsicher sein, welcher Wert für Ihre Situation am besten geeignet ist, empfiehlt es sich, maxSingleShotSize
auf den für blockSize
verwendeten Wert festzulegen.
Blockgröße
Der blockSize
-Wert ist die maximale Länge einer Übertragung in Bytes, wenn ein Block-Blob in Chunks hochgeladen wird.
maxSingleShotSize
wird wie bereits erwähnt nicht durch diesen Wert eingeschränkt und kann größer sein als blockSize
.
Zur Gewährleistung eines effizienten Datenflusses erreichen die Clientbibliotheken möglicherweise nicht bei jeder Übertragung den Wert von blockSize
. Je nach Vorgang kann der unterstützte Maximalwert für die Übertragungsgröße variieren. Weitere Informationen zu Grenzwerten im Zusammenhang mit der Übertragungsgröße für Blob Storage finden Sie im Diagramm unter Skalierbarkeitsziele für Blob Storage.
Codebeispiel
Im folgenden Codebeispiel wird gezeigt, wie Sie Werte für BlockBlobParallelUploadOptions festlegen und die Optionen als Teil eines Uploadmethodenaufrufs einbeziehen. Die in diesem Beispiel angegebenen Werte sind nicht als Empfehlungen zu verstehen. Zur ordnungsgemäßen Optimierung dieser Werte müssen die spezifischen Anforderungen Ihrer App berücksichtigt werden.
// Specify data transfer options
const uploadOptions = {
blockSize: 4 * 1024 * 1024, // 4 MiB max block size
concurrency: 2, // maximum number of parallel transfer workers
maxSingleShotSize: 8 * 1024 * 1024, // 8 MiB initial transfer size
}
// Create blob client from container client
const blockBlobClient = containerClient.getBlockBlobClient(blobName);
// Upload blob with transfer options
await blockBlobClient.uploadFile(localFilePath, uploadOptions);
In diesem Beispiel wird die maximale Anzahl von Workers für die parallele Übertragung mithilfe der Eigenschaft concurrency
auf „2“ festgelegt. Außerdem wird maxSingleShotSize
auf 8 MiB festgelegt. Wenn das Blob kleiner als 8 MiB ist, ist zum Abschließen des Uploadvorgangs nur eine einzelne Anforderung erforderlich. Wenn das Blob größer als 8 MiB ist, wird das Blob in Blöcken mit einer maximalen Größe von 4 MiB hochgeladen, die mit der blockSize
-Methode festgelegt wird.
Überlegungen zur Leistung bei Uploads
Während eines Uploads teilen die Storage-Client-Bibliotheken einen gegebenen Upload-Stream in mehrere Teil-Uploads auf, basierend auf den Konfigurationsoptionen, die von BlockBlobParallelUploadOptions
definiert werden. Jeder Teilupload verfügt über einen eigenen dedizierten Aufruf des REST-Vorgangs. In diesem Beispiel ist der Vorgang Put Block. Die Storage-Clientbibliothek verwaltet diese REST-Vorgänge parallel (abhängig von den Übertragungsoptionen), um den gesamten Upload abzuschließen.
Hinweis
Blockblobs haben eine maximale Blockanzahl von 50.000 Blöcken. Die maximale Größe Ihres Blockblobs entspricht also 50.000 mal block_size
.
Puffern bei Uploads
Das Fortsetzen angehaltener REST-Uploadvorgänge wird von der Storage-REST-Ebene nicht unterstützt. Einzelne Übertragungen werden entweder abgeschlossen oder gehen verloren. Um bei Datenstromuploads Resilienz sicherzustellen, puffern die Storage-Clientbibliotheken Daten für jeden einzelnen REST-Aufruf, bevor der Upload gestartet wird. Neben den Einschränkungen durch die Netzwerkgeschwindigkeit ist dieses Pufferverhalten ein Grund dafür, einen kleineren Wert für blockSize
in Betracht zu ziehen, auch wenn Uploadvorgänge nacheinander ausgeführt werden. Durch Verringern des Werts von blockSize
verringert sich die maximale Datenmenge, die für die einzelnen Anforderungen bzw. für Wiederholungsversuche bei fehlerhaften Anforderungen gepuffert wird. Falls bei Datenübertragungen mit einer bestimmten Größe häufig Timeouts auftreten, verringert die Senkung des Werts von blockSize
die Pufferzeit, was wiederum die Leistung verbessern kann.
Leistungsoptimierung für Downloads
Optimierungsoptionen für die Datenübertragung für Downloads sind nur verfügbar, wenn Sie die downloadToBuffer-Methode verwenden. Diese Methode lädt ein Blob parallel zu einem Puffer basierend auf den in BlobDownloadToBufferOptions definierten Werten herunter. Andere Downloadmethoden unterstützen keine Optimierungsoptionen für die Datenübertragung.
Festlegen von Übertragungsoptionen für Downloads
Beim Verwenden der downloadToBuffer
-Methode können die folgenden Werte für Downloads optimiert werden:
- blockSize: Die maximale Blockgröße, die für jede Anfrage übertragen wird.
- concurrency: Die maximale Anzahl der parallelen Anforderungen, die zu einem bestimmten Zeitpunkt als Teil einer einzigen parallelen Übertragung ausgegeben werden
Überlegungen zur Leistung bei Downloads
Während eines Downloads mithilfe von downloadToBuffer
teilen die Storage-Clientbibliotheken eine gegebene Downloadanforderung basierend auf den Konfigurationsoptionen, die von BlobDownloadToBufferOptions
definiert werden, in mehrere Teildownloads auf. Jeder Teildownload verfügt über einen eigenen dedizierten Aufruf des REST-Vorgangs. Abhängig von den Übertragungsoptionen verwalten die Clientbibliotheken die REST-Vorgänge parallel, um den gesamten Download abzuschließen.
Codebeispiel
Das folgende Codebeispiel zeigt, wie Werte für BlobDownloadToBufferOptions festgelegt und die Optionen als Teil eines downloadToBuffer-Methodenaufrufs eingeschlossen werden. Die in diesem Beispiel angegebenen Werte sind nicht als Empfehlungen zu verstehen. Zur ordnungsgemäßen Optimierung dieser Werte müssen die spezifischen Anforderungen Ihrer App berücksichtigt werden.
// Specify data transfer options
const downloadToBufferOptions = {
blockSize: 4 * 1024 * 1024, // 4 MiB max block size
concurrency: 2, // maximum number of parallel transfer workers
}
// Download data to buffer
const result = await client.downloadToBuffer(offset, count, downloadToBufferOptions);
Zugehöriger Inhalt
- Weitere Informationen zu Faktoren, die die Leistung von Azure Storage-Vorgängen beeinflussen können, finden Sie unter Latenz im Blobspeicher.
- Eine Liste der Entwurfsüberlegungen zum Optimieren der Leistung für Apps mit Blob Storage finden Sie in der Checkliste zu Leistung und Skalierbarkeit für Blob Storage.