Tingkatkan kecepatan pemrosesan data OSS, kurangi latensi, dan percepat respons aplikasi dengan memanfaatkan arsitektur terdistribusi Alibaba Cloud OSS.
Ubah awalan berurutan menjadi awalan acak
OSS mempartisi data berdasarkan urutan UTF-8 dari kunci objek untuk mendukung permintaan konkurensi tinggi. Awalan berurutan (seperti stempel waktu atau string yang diurutkan secara leksikografis) mengkonsentrasikan file dalam beberapa partisi saja, sehingga membebani partisi tersebut. Gunakan awalan acak sebagai gantinya agar beban terdistribusi merata.
Ketika laju permintaan Anda melebihi 2.000 permintaan per detik, masalah berikut dapat terjadi. Setiap unduhan, unggahan, penghapusan, penyalinan, atau pengambilan metadata dihitung sebagai satu operasi. Penghapusan atau pencatatan batch sebanyak N file dihitung sebagai N operasi.
-
Terbentuk partisi hot spot: Permintaan frekuensi tinggi terkonsentrasi pada partisi tertentu, menghabiskan kapasitas I/O-nya atau memicu pembatasan kecepatan otomatis.
-
Laju permintaan dibatasi: Partisi hot spot memicu penyeimbangan ulang data kontinu, yang meningkatkan waktu pemrosesan permintaan.
CatatanPenyeimbangan ulang didasarkan pada analisis status sistem dan kapasitas pemrosesan secara real-time, bukan aturan sharding tetap. File dengan awalan berurutan mungkin tetap berada di partisi hot spot setelah penyeimbangan ulang.
Untuk mengatasi masalah ini, ubah awalan berurutan menjadi awalan acak. Hal ini akan mendistribusikan indeks objek dan beban I/O secara merata di seluruh partisi.
-
Tambahkan awalan hash heksadesimal ke kunci objek
Jika Anda menggunakan tanggal dan ID pelanggan untuk menghasilkan kunci objek, kunci tersebut mengandung awalan stempel waktu berurutan:
sample-bucket-01/2024-07-19/customer-1/file1 sample-bucket-01/2024-07-19/customer-2/file2 sample-bucket-01/2024-07-19/customer-3/file3 ... sample-bucket-01/2024-07-20/customer-2/file4 sample-bucket-01/2024-07-20/customer-5/file5 sample-bucket-01/2024-07-20/customer-7/file6 ...Hitung hash (misalnya MD5) dari ID pelanggan dan gunakan beberapa karakter sebagai awalan kunci objek. Dengan awalan hash 4 karakter, kuncinya akan tampak seperti berikut:
sample-bucket-01/9b11/2024-07-19/customer-1/file1 sample-bucket-01/9fc2/2024-07-19/customer-2/file2 sample-bucket-01/d1b3/2024-07-19/customer-3/file3 ... sample-bucket-01/9fc2/2024-07-20/customer-2/file4 sample-bucket-01/f1ed/2024-07-20/customer-5/file5 sample-bucket-01/0ddc/2024-07-20/customer-7/file6 ...Hash heksadesimal 4 karakter menyediakan 164 (65.536) kombinasi yang mungkin, memungkinkan hingga 65.536 partisi. Tentukan apakah jumlah ini mencukupi berdasarkan laju permintaan Anda dan batas 2.000 operasi per detik per partisi.
Untuk mencantumkan objek berdasarkan tanggal (misalnya, semua objek dari 2024-07-19 di sample-bucket-01), cantumkan semua objek dalam bucket dengan memanggil API ListObject secara batch, lalu saring hasil yang sesuai dengan tanggal yang diinginkan.
-
Balikkan kunci objek
Stempel waktu UNIX dengan presisi milidetik sebagai kunci objek juga merupakan awalan berurutan:
sample-bucket-02/1513160001245.log sample-bucket-02/1513160001722.log sample-bucket-02/1513160001836.log sample-bucket-02/1513160001956.log ... sample-bucket-02/1513160002153.log sample-bucket-02/1513160002556.log sample-bucket-02/1513160002859.log ...Balikkan stempel waktu tersebut untuk menghindari pengurutan berurutan. Hasil pembalikan:
sample-bucket-02/5421000613151.log sample-bucket-02/2271000613151.log sample-bucket-02/6381000613151.log sample-bucket-02/6591000613151.log ... sample-bucket-02/3512000613151.log sample-bucket-02/6552000613151.log sample-bucket-02/9582000613151.log ...Tiga digit pertama merepresentasikan milidetik (1.000 nilai yang mungkin), digit keempat berubah setiap detik, dan digit kelima setiap 10 detik. Pembalikan ini sangat meningkatkan keacakan awalan, mendistribusikan beban secara merata, dan menghindari bottleneck.
Kurangi permintaan untuk sejumlah besar file kecil
Saat mengunggah banyak file kecil, kemas file-file tersebut ke dalam file ZIP, TAR, atau Parquet untuk menggabungkan beberapa permintaan menjadi satu. Misalnya, mengemas 100 file berukuran 1 KB masing-masing ke dalam satu file ZIP mengurangi 100 permintaan PUT menjadi 1.
Untuk mencantumkan sejumlah besar objek, gunakan Bucket Inventory alih-alih ListObjects untuk menghasilkan daftar objek dalam format CSV atau Parquet. Untuk informasi selengkapnya, lihat Bucket inventory.
Gunakan pengambilan rentang byte
Saat mengunduh file besar (lebih dari 100 MB) dari OSS, jaringan yang tidak stabil dapat mengganggu transfer. Gunakan permintaan HTTP Range untuk mengambil bagian tertentu dari file:
Get /ObjectName HTTP/1.1
Host:examplebucket.oss-cn-hangzhou.aliyuncs.com
Date:Fri, 19 Jul 2024 17:27:45 GMT
Authorization:SignatureValue
Range:bytes=[$ByteRange]
Header Range menentukan rentang byte antara 0 hingga content-length - 1. Cara memperoleh resource OSS secara segmen menggunakan permintaan HTTP Range.
Gunakan OSS Transfer Acceleration
Transfer Acceleration mempercepat transfer data jarak jauh untuk file berskala gigabyte atau terabyte, atau permintaan cross-region antara Tiongkok daratan dan wilayah lainnya. Fitur ini mengarahkan permintaan ke titik akses terdekat melalui perutean pintar, memberikan akselerasi end-to-end. Akses OSS menggunakan Transfer Acceleration.
Cache konten yang sering diakses
Alibaba Cloud CDN menyimpan cache konten statis di titik keberadaan (POPs) di seluruh dunia. Pengguna mengambil konten dari POP terdekat, meningkatkan kecepatan akses dan mengurangi beban origin.
Saat file yang diminta tidak tersedia atau kadaluarsa di POP, CDN mengambilnya dari bucket OSS origin dan menyimpannya dalam cache. Saat konten origin berubah, CDN secara otomatis memperbarui cache POP.
Hal ini sangat berguna bagi bisnis dengan basis pengguna global. Percepat akses ke OSS menggunakan CDN.
Gunakan versi terbaru SDK OSS
SDK Alibaba Cloud OSS terbaru mencakup optimasi kinerja bawaan:
-
Fitur baru: Menyertakan API terbaru, algoritma yang dioptimalkan, dan kodek yang lebih efisien.
-
Penanganan error dan retry: Secara otomatis menangani error umum (seperti HTTP 503) untuk mengurangi kegagalan dan meningkatkan tingkat keberhasilan.
-
Manajemen transfer: Secara otomatis menskalakan koneksi dan menggunakan permintaan range untuk mencapai throughput tinggi.
-
Dukungan multi-thread: Memproses beberapa permintaan secara paralel untuk meningkatkan kecepatan pemrosesan data.
-
Manajemen memori yang dioptimalkan: Mengurangi overhead memori yang tidak perlu dan meningkatkan efisiensi penggunaan.
-
Kompatibilitas yang ditingkatkan: Memperbaiki masalah lama dan meningkatkan kompatibilitas dengan pustaka pihak ketiga serta sistem operasi.
Unduh SDK terbaru dari Ikhtisar SDK.
Gunakan OSS dan ECS dalam wilayah yang sama
Deploy instance ECS dan bucket OSS dalam wilayah yang sama untuk mengurangi latensi transfer data dan meningkatkan kecepatan baca. Komunikasi dalam satu wilayah menggunakan Titik akhir internal dan tidak dikenai biaya trafik, memungkinkan transfer data skala besar tanpa biaya bandwidth. Akses resource OSS dari instance ECS melalui jaringan internal.
Terapkan retry timeout untuk aplikasi yang sensitif terhadap latensi
OSS membatasi QPS untuk API management (GetService, PutBucket, GetBucketLifecycle, dll.). Laju permintaan tinggi dapat memicu respons perlambatan HTTP 503. Jika hal ini terjadi, tunggu beberapa detik lalu coba lagi.
Total QPS untuk satu Akun Alibaba Cloud adalah 10.000. Untuk meminta batas yang lebih tinggi, hubungi Technical Support. Bahkan di bawah ambang batas ini, server mungkin melakukan throttle dan mengembalikan error 503 jika permintaan terkonsentrasi pada satu partisi dan melebihi kapasitasnya. Jika Anda mengacak awalan permintaan Anda (lihat Praktik terbaik kinerja dan skalabilitas OSS), OSS secara otomatis menskalakan partisi untuk mendukung QPS yang lebih tinggi. Anda hanya perlu menunggu dan mencoba lagi.
Untuk permintaan besar (lebih dari 128 MB), ukur throughput dan coba ulang 5% yang paling lambat. Untuk permintaan kecil (di bawah 512 KB) dengan latensi khas dalam puluhan milidetik, coba ulang operasi GET atau PUT setelah 2 detik. Gunakan exponential backoff untuk percobaan ulang berikutnya (misalnya, 2 detik, lalu 4 detik).
Untuk permintaan berukuran tetap dengan waktu respons konsisten, identifikasi dan coba ulang 1% yang paling lambat. Satu kali retry saja sering kali cukup efektif untuk mengurangi latensi.
Raih throughput tinggi dengan skalabilitas horizontal dan permintaan paralel
OSS adalah sistem terdistribusi berskala besar. Lakukan skalabilitas horizontal dengan permintaan paralel untuk mendistribusikan beban di beberapa jalur jaringan.
Unggah dan unduh data secara paralel melalui beberapa thread atau instans. Strategi penskalaan optimal tergantung pada aplikasi dan struktur objek Anda.
Mulailah dengan satu permintaan untuk mengukur bandwidth dan penggunaan sumber daya, lalu tentukan jumlah maksimum permintaan konkuren. Misalnya, jika satu permintaan menggunakan 10% CPU, Anda dapat mendukung hingga 10 permintaan konkuren.
Lakukan skalabilitas horizontal koneksi penyimpanan
Perlakukan OSS sebagai sistem terdistribusi, bukan sebagai satu titik akhir saja. Kirim beberapa permintaan konkuren melalui koneksi berbeda untuk memaksimalkan bandwidth yang tersedia. OSS tidak membatasi jumlah koneksi ke suatu bucket.
Untuk mengunggah batch besar file kecil, gunakan ossutil dengan parameter konkurensi -j 100~500, dikombinasikan dengan strategi retry exponential backoff dari SDK OSS untuk menangani throttling.
Tingkatkan jumlah retry
Jika suatu permintaan lambat, kirim retry. Konfigurasikan nilai timeout dan retry di SDK OSS berdasarkan kebutuhan toleransi kesalahan aplikasi Anda.