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);