Freigeben über


Leistungsoptimierung für Uploads und Downloads mit Java

Wenn eine Anwendung Daten unter Verwendung der Azure Storage-Clientbibliothek für Java überträgt, gibt es mehrere Faktoren, die sich auf die Geschwindigkeit, die Arbeitsspeicherauslastung 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 Werte unter ParallelTransferOptions konfigurieren, um die Leistung für Datenübertragungsvorgänge zu verbessern. Die folgenden Werte können für Uploads je nach den Bedürfnissen Ihrer Anwendung angepasst werden:

  • maxSingleUploadSize: Die maximale BLOB-Größe in Bytes für einen einzelnen Anforderungsupload.
  • blockSize: Die maximale Blockgröße, die für jede Anfrage übertragen wird.
  • maxConcurrency: Die maximale Anzahl der parallelen Anfragen, die zu einem bestimmten Zeitpunkt als Teil einer einzigen 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.

maxSingleUploadSize

Der maxSingleUploadSize-Wert ist die maximale Blobgröße in Bytes für eine einzelne Upload-Anfrage. Dieser Wert kann mit der folgenden Methode festgelegt werden:

Wenn die Datengröße kleiner oder gleich maxSingleUploadSize ist, wird das Blob mit einer einzelnen Put Blob-Anforderung hochgeladen. Wenn die Blobgröße größer als maxSingleUploadSizeoder aber 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 maxSingleUploadSize definierte Wert wird nicht durch den für blockSize angegebenen Wert eingeschränkt. Das Argument maxSingleUploadSize definiert eine separate Größenbeschränkung für eine Anforderung, um den gesamten Vorgang auf einmal (ohne Teilübertragungen) durchzuführen. maxSingleUploadSize 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, maxSingleUploadSize 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. Dieser Wert kann mit der folgenden Methode festgelegt werden:

Der blockSize-Wert ist die maximale Länge einer Übertragung in Bytes, wenn ein Block-Blob in Chunks hochgeladen wird. maxSingleUploadSize 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.

maxConcurrency

Der maxConcurrency-Wert ist die maximale Anzahl von parallelen Anfragen, die zu einem bestimmten Zeitpunkt als Teil einer einzigen parallelen Übertragung ausgegeben werden. Dieser Wert kann mit der folgenden Methode festgelegt werden:

Codebeispiel

Stellen Sie sicher, dass Sie über die folgende import Anweisung für einen Upload verfügen ParallelTransferOptions:

import com.azure.storage.blob.models.*;

Im folgenden Codebeispiel wird gezeigt, wie Sie Werte für ParallelTransferOptions festlegen und die Optionen als Teil einer BlobUploadFromFileOptions-Instanz einbeziehen. Wenn Sie nicht aus einer Datei hochladen, können Sie ähnliche Optionen mit BlobParallelUploadOptions festlegen. 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.

ParallelTransferOptions parallelTransferOptions = new ParallelTransferOptions()
        .setBlockSizeLong((long) (4 * 1024 * 1024)) // 4 MiB block size
        .setMaxConcurrency(2)
        .setMaxSingleUploadSizeLong((long) 8 * 1024 * 1024); // 8 MiB max size for single request upload

BlobUploadFromFileOptions options = new BlobUploadFromFileOptions("<localFilePath>");
options.setParallelTransferOptions(parallelTransferOptions);

Response<BlockBlobItem> blockBlob = blobClient.uploadFromFileWithResponse(options, null, null);

In diesem Beispiel wird die maximale Anzahl von Workers für die parallele Übertragung mithilfe der Eigenschaft setMaxConcurrency auf „2“ festgelegt. Wir legen auch mit der setMaxSingleUploadSizeLong-Methode auf 8 MiB fest maxSingleUploadSize. Wenn das Blob kleiner als 8 MiB ist, ist zum Abschließen des Uploadvorgangs nur eine einzelne Anforderung erforderlich. Wenn der Blob größer als 8 MiB ist, wird der Blob in Chunks mit einer maximalen Chunk-Größe von 4 MiB hochgeladen, die wir mit der setBlockSizeLong-Methode festlegen.

Ü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 ParallelTransferOptions definiert werden. Jeder Teilupload verfügt über einen eigenen dedizierten Aufruf des REST-Vorgangs. Bei einem BlobClient-Objekt wird der Vorgang Put Block verwendet. 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

Die richtige Optimierung von Datenübertragungsoptionen ist der Schlüssel für eine zuverlässige Leistung bei Downloads. Speicherübertragungen werden in mehrere Teilübertragungen unterteilt, basierend auf den Werten, die in ParallelTransferOptions definiert werden.

Festlegen von Übertragungsoptionen für Downloads

Die folgenden Werte können basierend auf den Anforderungen Ihrer App für Downloads optimiert werden:

  • blockSize: Die maximale zu übertragende Blockgröße für jede Anforderung fest. Sie können diesen Wert mit der Methode setBlockSizeLong festlegen.
  • maxConcurrency: Die maximale Anzahl paralleler Anforderungen, die zu einem bestimmten Zeitpunkt im Rahmen einer einzelnen parallelen Übertragung ausgegeben werden. Sie können diesen Wert mit der Methode setMaxConcurrency festlegen.

Codebeispiel

Stellen Sie sicher, dass Sie über die folgende import Anweisung zum Herunterladen verfügen ParallelTransferOptions:

import com.azure.storage.common.*;

Im folgenden Codebeispiel wird gezeigt, wie Sie Werte für ParallelTransferOptions festlegen und die Optionen als Teil einer BlobUploadToFileOptions-Instanz einbeziehen.

ParallelTransferOptions parallelTransferOptions = new ParallelTransferOptions()
        .setBlockSizeLong((long) (4 * 1024 * 1024)) // 4 MiB block size
        .setMaxConcurrency(2);

BlobDownloadToFileOptions options = new BlobDownloadToFileOptions("<localFilePath>");
options.setParallelTransferOptions(parallelTransferOptions);

blobClient.downloadToFileWithResponse(options, null, null);

Überlegungen zur Leistung bei Downloads

Während eines Downloads teilen die Bibliotheken des Storage-Clients eine gegebene Download-Anfrage in mehrere Teil-Downloads auf, basierend auf den Konfigurationsoptionen, die von ParallelTransferOptions definiert werden. 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.

Nächste Schritte