Сценарий: подача большого двоичного объекта из Azure через RestController из-за доступа к файлу на основе ролей.
SharedKeyCredentials, HttpPipeline, ServiceURL и ContainerURL создаются один раз в конструкторе
public AzureSdkBlobStorageServiceImpl(AzureBlobStorageConfig azureBlobStorageConfig) throws InvalidKeyException {
SharedKeyCredentials credential = new SharedKeyCredentials(azureBlobStorageConfig.getAccountName(), azureBlobStorageConfig.getAccountKey());
HttpPipeline pipeline = StorageURL.createPipeline(credential, new PipelineOptions());
ServiceURL serviceURL = new ServiceURL(azureBlobStorageConfig.getServiceUrl(), pipeline);
containerURL = serviceURL.createContainerURL(azureBlobStorageConfig.getContainerName());
}
Попытка выполнитьиспользуйте SDK и возвращайте его только после загрузки большого двоичного объекта.
public Blob getBlob(String identifier) {
BlockBlobURL blobURL = containerURL.createBlockBlobURL(identifier);
ByteBuffer byteBuffer = FlowableUtil.collectBytesInBuffer(blobURL.download().blockingGet().body(new ReliableDownloadOptions()))
.blockingGet();
return new Blob(identifier, byteBuffer.array());
}
После предоставления getBlob (идентификатора строки) в качестве конечной точки отдыха все работает.
blob-urls.txt http://localhost:8084/blob/my-image.jpg
1.AzureSdkBlobStorageServiceImpl против 1 одновременного пользователя в течение 2 минут
осада -v -c 1 -t 2m -f blob-urls.txt
Transactions: 583 hits
Availability: 100.00 %
Elapsed time: 119.65 secs
Data transferred: 1103.75 MB
Response time: 0.20 secs
Transaction rate: 4.87 trans/sec
Throughput: 9.22 MB/sec
Concurrency: 1.00
Successful transactions: 583
Failed transactions: 0
Longest transaction: 0.97
Shortest transaction: 0.15
2.AzureSdkBlobStorageServiceImpl против 10 одновременных пользователей в течение 2 минут
осада -v -c 10 -t 2m -f blob-urls.txt
Transactions: 505 hits
Availability: 100.00 %
Elapsed time: 119.18 secs
Data transferred: 956.07 MB
Response time: 2.30 secs
Transaction rate: 4.24 trans/sec
Throughput: 8.02 MB/sec
Concurrency: 9.76
Successful transactions: 505
Failed transactions: 0
Longest transaction: 8.92
Shortest transaction: 0.17
3.AzureSdkBlobStorageServiceImpl против 100 одновременных пользователей в течение 2 минут
осада -v -c 100 -t 2m -f blob-urls.txt
Transactions: 723 hits
Availability: 100.00 %
Elapsed time: 119.88 secs
Data transferred: 1368.80 MB
Response time: 15.42 secs
Transaction rate: 6.03 trans/sec
Throughput: 11.42 MB/sec
Concurrency: 93.01
Successful transactions: 723
Failed transactions: 0
Longest transaction: 45.16
Shortest transaction: 0.51
Я не уверен, как это интерпретировать.
Глядя на прогоны 1 и 2, кажется, что все запросы к Azure ждут друг друга.
Однако в прогоне 3 пропускная способность выше.
При использовании хранилища Azure-java V10 SDK из блокирующего потока, мне нужно настроить базовый httpclient с большим количеством потоков?
Чтобы подвести итог
- Я не могу изменить код вызова в данный момент, поэтому яугадайте, я вынужден сделать blockingGet ()?
- Есть ли что-то, что я могу сделать, чтобы улучшить пропускную способность с помощью Azure-Storage-Java V10 SDK?
- Я делаю это неправильно?