Mengakses file (objek) di Object Storage Service (OSS) dapat mengonsumsi bandwidth dalam jumlah besar. Pada klien yang sulit menerapkan traffic shaping, hal ini dapat memengaruhi aplikasi lain. Untuk menghindari masalah tersebut, Anda dapat menggunakan fitur pembatasan bandwidth koneksi tunggal yang disediakan oleh OSS guna mengontrol lalu lintas selama operasi seperti unggah dan unduh file, sehingga memastikan tersedianya bandwidth jaringan yang cukup bagi aplikasi lain.
Catatan penggunaan
Sertakan parameter x-oss-traffic-limit dalam permintaan PutObject, AppendObject, PostObject, CopyObject, UploadPart, UploadPartCopy, dan GetObject, lalu tentukan nilai pembatasannya. Nilai tersebut harus berada dalam rentang 819.200 hingga 838.860.800 bit/s.
Pembatasan kecepatan permintaan klien
Anda hanya dapat membatasi kecepatan permintaan klien menggunakan kit pengembangan perangkat lunak (SDK). Kode berikut menyajikan contoh cara membatasi kecepatan permintaan unggah atau unduh menggunakan SDK umum. Untuk contoh kode yang menggunakan SDK lainnya, lihat Ikhtisar SDK.
Pembatasan kecepatan unggah dan unduh sederhana
Pembatasan kecepatan unggah multi-bagian
Pembatasan bandwidth menggunakan URL file
Untuk file dengan izin baca-publik atau baca-tulis publik, Anda dapat menambahkan parameter pembatasan x-oss-traffic-limit=<value> ke URL file untuk membatasi akses. Sebagai contoh, URL https://examplebucket.oss-cn-hangzhou.aliyuncs.com/video.mp4?x-oss-traffic-limit=819200 menentukan bahwa kecepatan unduh untuk file video.mp4 dibatasi menjadi 100 KB/s. Contoh berikut menunjukkan efek pembatasan:
Kecepatan unduh aktual adalah 96,0 KB/s, mendekati ambang batas pembatasan yang dikonfigurasi sebesar 100 KB/s. Ukuran total file adalah 29,9 MB, dengan 2,3 MB telah diunduh dan tersisa sekitar 5 menit.
Pembatasan bandwidth menggunakan URL yang ditandatangani
Saat Anda menggunakan SDK untuk menghasilkan URL yang ditandatangani guna mengakses file privat, Anda harus menyertakan parameter pembatasan dalam perhitungan tanda tangan. Kode berikut menyajikan contoh cara menambahkan parameter pembatasan ke URL yang ditandatangani menggunakan SDK umum. Untuk contoh kode yang menggunakan SDK lainnya, lihat Ikhtisar SDK.
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.GeneratePresignedUrlRequest;
import com.aliyun.oss.model.GetObjectRequest;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URL;
import java.util.Date;
public class Demo {
public static void main(String[] args) throws Throwable {
// Dalam contoh ini, titik akhir wilayah China (Hangzhou) digunakan. Tentukan titik akhir aktual Anda.
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum Anda menjalankan kode sampel, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// Tentukan nama bucket. Contoh: examplebucket.
String bucketName = "examplebucket";
// Tentukan path lengkap objek. Jangan sertakan nama bucket dalam path lengkap. Contoh: exampledir/exampleobject.txt.
String objectName = "exampledir/exampleobject.txt";
// Tentukan path lengkap file lokal yang ingin Anda unggah. Contoh: D:\\localpath\\examplefile.txt.
// Jika Anda tidak menentukan path file lokal, file lokal diunggah dari path proyek program sampel.
String localFileName = "D:\\localpath\\examplefile.txt";
// Tentukan path lengkap tujuan Anda mengunduh objek. Jika file dengan nama yang sama sudah ada, objek yang diunduh akan menimpa file tersebut. Jika tidak, objek yang diunduh akan disimpan di path tersebut.
// Jika Anda tidak menentukan path untuk objek yang diunduh, objek yang diunduh akan disimpan ke path proyek program sampel.
String downLoadFileName = "D:\\localpath\\exampleobject.txt";
// Atur batas bandwidth ke 100 KB/s.
int limitSpeed = 100 * 1024 * 8;
// Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah ke cn-hangzhou.
String region = "cn-hangzhou";
// Buat instans Klien OSS.
// Panggil metode shutdown untuk melepaskan sumber daya terkait saat Klien OSS tidak lagi digunakan.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// Buat URL yang ditandatangani yang menyertakan parameter pembatasan bandwidth untuk unggahan objek dan atur periode validitas URL ke 60 detik.
Date date = new Date();
date.setTime(date.getTime() + 60 * 1000);
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.PUT);
request.setExpiration(date);
request.setTrafficLimit(limitSpeed);
URL signedUrl = ossClient.generatePresignedUrl(request);
System.out.println("put object url" + signedUrl);
// Konfigurasikan pembatasan bandwidth untuk unggahan objek.
InputStream inputStream = new FileInputStream(localFileName);
ossClient.putObject(signedUrl, inputStream, -1, null, true);
// Buat URL yang ditandatangani yang menyertakan parameter pembatasan bandwidth untuk unduhan objek dan atur periode validitas URL ke 60 detik.
date = new Date();
date.setTime(date.getTime() + 60 * 1000);
request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET);
request.setExpiration(date);
request.setTrafficLimit(limitSpeed);
signedUrl = ossClient.generatePresignedUrl(request);
System.out.println("get object url" + signedUrl);
// Konfigurasikan pembatasan bandwidth untuk unduhan objek.
GetObjectRequest getObjectRequest = new GetObjectRequest(signedUrl, null);
ossClient.getObject(getObjectRequest, new File(downLoadFileName));
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}<?php
if (is_file(__DIR__ . '/../autoload.php')) {
require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
require_once __DIR__ . '/../vendor/autoload.php';
}
use OSS\Credentials\EnvironmentVariableCredentialsProvider;
use OSS\OssClient;
use OSS\Core\OssException;
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum Anda menjalankan kode sampel, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
$provider = new EnvironmentVariableCredentialsProvider();
// Tentukan titik akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur titik akhir ke https://oss-cn-hangzhou.aliyuncs.com.
$endpoint = "yourEndpoint";
// Tentukan nama bucket. Contoh: examplebucket.
$bucket= "examplebucket";
// Tentukan jalur lengkap objek. Contoh: exampledir/exampleobject.txt. Jangan sertakan nama bucket dalam jalur lengkap.
$object = "exampledir/exampleobject.txt";
$config = array(
"provider" => $provider,
"endpoint" => $endpoint,
"signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
"region"=> "cn-hangzhou"
);
$ossClient = new OssClient($config);
// Atur batas bandwidth ke 100 KB/s, yang sama dengan 819.200 bit/s.
$options = array(
OssClient::OSS_TRAFFIC_LIMIT => 819200,
);
// Buat URL yang ditandatangani untuk pengunggahan objek dengan pembatasan bandwidth koneksi tunggal yang dikonfigurasi dan atur periode validitas URL selama 60 detik.
$timeout = 60;
$signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "PUT", $options);
print($signedUrl);
// Buat URL yang ditandatangani untuk pengunduhan objek dengan pembatasan bandwidth koneksi tunggal yang dikonfigurasi dan atur periode validitas URL selama 120 detik.
$timeout = 120;
$signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "GET", $options);
print($signedUrl);# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
from oss2.models import OSS_TRAFFIC_LIMIT
# Dapatkan kredensial akses dari variabel lingkungan. Sebelum Anda menjalankan kode sampel, pastikan bahwa variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# Tentukan titik akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur titik akhir ke https://oss-cn-hangzhou.aliyuncs.com.
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# Tentukan ID wilayah yang memetakan ke titik akhir. Contoh: cn-hangzhou. Parameter ini wajib diisi jika Anda menggunakan algoritma tanda tangan V4.
region = "cn-hangzhou"
# Tentukan nama bucket.
bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)
# Tentukan jalur lengkap objek. Jangan sertakan nama bucket dalam jalur lengkap. Contoh: exampledir/exampleobject.txt.
object_name = 'exampledir/exampleobject.txt'
# Tentukan jalur lengkap file lokal yang ingin Anda unggah. Contoh: D:\\localpath\\examplefile.txt. Secara default, jika Anda tidak menentukan jalur file lokal, file lokal akan diunggah dari jalur proyek tempat program sampel berada.
local_file_name = 'D:\\localpath\\examplefile.txt'
# Tentukan jalur lokal tempat Anda ingin mengunduh objek. Jika file dengan nama yang sama sudah ada, objek yang diunduh akan menimpa file tersebut. Jika tidak ada file dengan nama yang sama, objek yang diunduh akan disimpan di jalur tersebut.
# Jika Anda tidak menentukan jalur untuk objek yang diunduh, objek yang diunduh akan disimpan ke jalur proyek tempat program sampel berada.
down_file_name = 'D:\\localpath\\exampleobject.txt'
# Konfigurasikan parameter params untuk mengatur batas bandwidth ke 100 KB/dtk, yang sama dengan 819.200 bit/dtk.
limit_speed = (100 * 1024 * 8)
params = dict()
params[OSS_TRAFFIC_LIMIT] = str(limit_speed)
# Buat URL yang ditandatangani yang menyertakan parameter pembatasan bandwidth untuk unggahan objek dan atur periode validitas URL ke 60 detik.
url = bucket.sign_url('PUT', object_name, 60, params=params)
print('put object url:', url)
# Konfigurasikan pembatasan bandwidth untuk unggahan objek.
result = bucket.put_object_with_url_from_file(url, local_file_name)
print('http response status:', result.status)
# Buat URL yang ditandatangani yang menyertakan parameter pembatasan bandwidth untuk unduhan objek dan atur periode validitas URL ke 60 detik.
url = bucket.sign_url('GET', object_name, 60, params=params)
print('get object url:', url)
# Konfigurasikan pembatasan bandwidth untuk unduhan objek.
result = bucket.get_object_with_url_to_file(url, down_file_name)
print('http response status:', result.status)package main
import (
"log"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// Peroleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Failed to create credentials provider: %v", err)
}
// Buat instans OSSClient.
// Tentukan endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur endpoint menjadi https://oss-cn-hangzhou.aliyuncs.com. Tentukan endpoint aktual Anda.
// Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah menjadi cn-hangzhou. Tentukan wilayah aktual.
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// Tentukan versi algoritma tanda tangan.
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Failed to create OSS client: %v", err)
}
// Tentukan nama bucket. Contoh: examplebucket.
bucketName := "examplebucket"
bucket, err := client.Bucket(bucketName)
if err != nil {
log.Fatalf("Failed to get bucket '%s': %v", bucketName, err)
}
// Gunakan URL yang ditandatangani untuk mengunggah objek.
// Tentukan path lengkap file lokal yang akan diunggah. Contoh: D:\\localpath\\exampleobject.txt.
localFilePath := "D:\\localpath\\exampleobject.txt"
fd, err := os.Open(localFilePath)
if err != nil {
log.Fatalf("Failed to open local file '%s': %v", localFilePath, err)
}
defer fd.Close()
// Tentukan batas bandwidth untuk unggah. Nilai parameter harus berupa angka. Satuan default: bit/s. Dalam contoh ini, batas bandwidth diatur menjadi 5 MB/s.
traffic := int64(41943040)
// Peroleh URL yang ditandatangani yang digunakan untuk mengunggah objek.
// Tentukan path lengkap objek. Jangan sertakan nama bucket dalam path lengkap.
objectName := "exampledir/exampleobject.txt"
strURL, err := bucket.SignURL(objectName, oss.HTTPPut, 60, oss.TrafficLimitParam(traffic))
if err != nil {
log.Fatalf("Failed to generate signed URL for uploading '%s': %v", objectName, err)
}
// Unggah file lokal.
err = bucket.PutObjectWithURL(strURL, fd)
if err != nil {
log.Fatalf("Failed to upload object '%s': %v", objectName, err)
}
// Gunakan URL yang ditandatangani untuk mengunduh objek.
// Peroleh URL yang ditandatangani yang digunakan untuk mengunduh objek.
strURL, err = bucket.SignURL(objectName, oss.HTTPGet, 60, oss.TrafficLimitParam(traffic))
if err != nil {
log.Fatalf("Failed to generate signed URL for downloading '%s': %v", objectName, err)
}
// Tentukan path lengkap tujuan unduhan objek.
downloadFilePath := "D:\\localpath\\exampleobject.txt"
err = bucket.GetObjectToFileWithURL(strURL, downloadFilePath)
if err != nil {
log.Fatalf("Failed to download object '%s' to '%s': %v", objectName, downloadFilePath, err)
}
log.Println("Upload and download completed successfully")
}
using System.Text;
using Aliyun.OSS;
using Aliyun.OSS.Common;
// Tentukan titik akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur titik akhir ke https://oss-cn-hangzhou.aliyuncs.com.
var endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum Anda menjalankan kode sampel, pastikan bahwa variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// Tentukan nama bucket. Contoh: examplebucket.
var bucketName = "examplebucket";
// Tentukan jalur lengkap objek. Jangan sertakan nama bucket dalam jalur lengkap. Contoh: exampledir/exampleobject.txt.
var objectName = "exampledir/exampleobject.txt";
var objectContent = "More than just cloud.";
var downloadFilename = "D:\\localpath\\examplefile.txt";
// Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah ke cn-hangzhou.
const string region = "cn-hangzhou";
// Buat instans ClientConfiguration dan ubah parameter sesuai kebutuhan.
var conf = new ClientConfiguration();
// Gunakan algoritma tanda tangan V4.
conf.SignatureVersion = SignatureVersion.V4;
// Buat instans OSSClient.
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);
try
{
// Buat URL yang ditandatangani untuk mengunggah objek.
var generatePresignedUriRequest = new GeneratePresignedUriRequest(bucketName, objectName, SignHttpMethod.Put)
{
Expiration = DateTime.Now.AddHours(1),
};
// Atur batas bandwidth ke 100 KB/s, yang sama dengan 819.200 bit/s.
generatePresignedUriRequest.AddQueryParam("x-oss-traffic-limit", "819200");
var signedUrl = client.GeneratePresignedUri(generatePresignedUriRequest);
// Gunakan URL yang ditandatangani untuk mengunggah objek.
var buffer = Encoding.UTF8.GetBytes(objectContent);
using (var ms = new MemoryStream(buffer))
{
client.PutObject(signedUrl, ms);
}
Console.WriteLine("Put object by signatrue succeeded. {0} ", signedUrl.ToString());
var metadata = client.GetObjectMetadata(bucketName, objectName);
var etag = metadata.ETag;
// Buat URL yang ditandatangani untuk mengunduh objek.
// Atur batas bandwidth ke 100 KB/s, yang sama dengan 819.200 bit/s.
var req = new GeneratePresignedUriRequest(bucketName, objectName, SignHttpMethod.Get);
req.AddQueryParam("x-oss-traffic-limit", "819200");
var uri = client.GeneratePresignedUri(req);
// Gunakan URL yang ditandatangani untuk mengunduh objek.
OssObject ossObject = client.GetObject(uri);
using (var file = File.Open(downloadFilename, FileMode.OpenOrCreate))
{
using (Stream stream = ossObject.Content)
{
int length = 4 * 1024;
var buf = new byte[length];
do
{
length = stream.Read(buf, 0, length);
file.Write(buf, 0, length);
} while (length != 0);
}
}
Console.WriteLine("Get object by signatrue succeeded. {0} ", uri.ToString());
}
catch (Exception ex)
{
Console.WriteLine("Put object failed, {0}", ex.Message);
}#include <alibabacloud/oss/OssClient.h>
#include <fstream>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* Inisialisasi informasi akun OSS. */
/* Atur yourEndpoint ke titik akhir wilayah tempat bucket berada. Misalnya, untuk wilayah China (Hangzhou), atur titik akhir ke https://oss-cn-hangzhou.aliyuncs.com. */
std::string Endpoint = "yourEndpoint";
/* Atur yourRegion ke wilayah tempat bucket berada. Misalnya, untuk wilayah China (Hangzhou), atur wilayah ke cn-hangzhou. */
std::string Region = "yourRegion";
/* Tentukan nama bucket, misalnya, examplebucket. */
std::string BucketName = "examplebucket";
/* Tentukan jalur lengkap objek. Jalur lengkap tidak boleh berisi nama bucket. Misalnya, exampledir/exampleobject.txt. */
std::string ObjectName = "exampledir/exampleobject.txt";
/* Inisialisasi sumber daya jaringan. */
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* Dapatkan kredensial akses dari variabel lingkungan. Sebelum Anda menjalankan kode sampel ini, pastikan bahwa variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah diatur. */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
/* Atur periode validitas tanda tangan. Periode validitas maksimum adalah 32.400 detik. */
std::time_t expires = std::time(nullptr) + 1200;
/* Buat URL untuk mengunggah file. */
GeneratePresignedUrlRequest putrequest(BucketName, ObjectName, Http::Put);
putrequest.setExpires(expires);
/* Atur batas lebar pita unggah ke 100 KB/dtk. */
putrequest.setTrafficLimit(819200);
auto genOutcome = client.GeneratePresignedUrl(putrequest);
std::shared_ptr<std::iostream> content = std::make_shared<std::stringstream>();
*content << "test cpp sdk";
/* Cetak hasil URL yang ditandatangani untuk unggahan. */
std::cout << "Signed URL for upload: " << genOutcome.result() << std::endl;
/* Gunakan URL yang ditandatangani untuk mengunggah file. */
auto outcome = client.PutObjectByUrl(genOutcome.result(), content);
/* Buat URL untuk mengunduh file. */
GeneratePresignedUrlRequest getrequest(BucketName, ObjectName, Http::Get);
getrequest.setExpires(expires);
/* Atur batas bandwidth unduh ke 100 KB/dtk. */
getrequest.setTrafficLimit(819200);
genOutcome = client.GeneratePresignedUrl(getrequest);
/* Cetak hasil URL yang ditandatangani untuk unduhan. */
std::cout << "Signed URL for download: " << genOutcome.result() << std::endl;
/* Gunakan URL yang ditandatangani untuk mengunduh file. */
auto goutcome = client.GetObjectByUrl(genOutcome.result());
/* Lepaskan sumber daya jaringan. */
ShutdownSdk();
return 0;
}