Pertanyaan Dorong file ke Amazon Cloudfront: Kemungkinan?


Saya telah membaca tentang menarik dan mendorong CDN. Saya telah menggunakan Cloudfront sebagai pull CDN untuk gambar yang diubah ukurannya:

  • Terima gambar dari klien
  • Masukkan gambar dalam S3

nanti, ketika klien membuat permintaan ke cloudfront untuk URL, Cloudfront tidak memiliki gambar, maka itu harus diteruskan ke server saya, yang:

  • Terima permintaan
  • Tarik gambar dari S3
  • Ubah ukuran gambar
  • Dorong gambar kembali ke Cloudfront

Namun, ini membutuhkan waktu beberapa detik, yang benar-benar menjengkelkan ketika Anda pertama kali mengunggah gambar cantik Anda dan ingin melihatnya. Penundaan tampaknya sebagian besar waktu unduh / reuploading, daripada mengubah ukuran, yang cukup cepat.

Apakah mungkin untuk secara proaktif mendorong gambar yang diubah ukurannya ke Cloudfront dan melampirkannya ke URL, sehingga permintaan di masa mendatang dapat langsung mendapatkan gambar yang disiapkan? Idealnya saya mau

  • Terima gambar dari klien
  • Masukkan gambar dalam S3
  • Ubah ukuran gambar untuk ukuran umum
  • Secara pre-emptive, dorong ukuran ini ke cloudfront

Ini akan menghindari keseluruhan siklus pengunduhan / reupload, membuat ukuran umum sangat cepat, tetapi ukuran yang kurang umum masih dapat diakses (meskipun dengan penundaan pertama kali). Namun, untuk melakukan ini saya harus mendorong gambar ke Cloudfront. Ini:

http://www.whoishostingthis.com/blog/2010/06/30/cdns-push-vs-pull/

tampaknya menyarankan itu bisa dilakukan, tetapi segala sesuatu yang pernah saya lihat tidak menyebutkannya. Pertanyaan saya adalah: mungkinkah? Atau apakah ada solusi lain untuk masalah ini yang saya lewatkan?


10
2018-05-02 18:44


asal


Jawaban:


Kami telah mencoba hal yang serupa dengan penyedia CDN yang berbeda, dan untuk CloudFront saya tidak berpikir ada cara yang ada bagi Anda untuk mendorong (apa yang kami sebut pra-makan) konten khusus Anda ke node / tepi jika distribusi cloudfront menggunakan Anda asal kebiasaan.

Satu cara yang dapat saya pikirkan, juga seperti yang disebutkan oleh @ Xint0 adalah menyiapkan bucket S3 lain untuk secara khusus menghosting file-file yang ingin Anda dorong (dalam kasus Anda gambar-gambar yang diubah ukurannya). Pada dasarnya Anda akan memiliki dua cloudFront distribusi satu untuk menarik file-file yang jarang diakses dan lainnya untuk mendorong file-file yang sering diakses dan juga gambar-gambar yang Anda harapkan untuk diubah ukurannya. Ini terdengar sedikit rumit tetapi saya percaya itulah tradeoff yang harus Anda buat.

Hal lain yang dapat saya sarankan untuk Anda lihat adalah EdgeCast yang merupakan penyedia CDN lain dan mereka menyediakan fungsi yang disebut load_to_edge (yang saya menghabiskan cukup banyak waktu bulan lalu untuk mengintegrasikan ini dengan layanan kami, itulah mengapa saya mengingatnya dengan jelas) yang mana apa yang kamu harapkan. Mereka juga mendukung tarik asal kustom, sehingga mungkin Anda dapat mengambil uji coba di sana.


4
2018-05-08 01:50



OP meminta solusi push CDN, tetapi sepertinya dia benar-benar hanya mencoba untuk membuat semuanya lebih cepat. Saya menjelajah bahwa Anda mungkin tidak benar-benar perlu menerapkan dorongan CDN, Anda hanya perlu mengoptimalkan pola server asal Anda.

Jadi, OP, saya akan menganggap Anda mendukung paling banyak beberapa ukuran gambar - katakanlah 128x128, 256x256, dan 512x512. Ini juga terdengar seperti Anda memiliki versi asli dari gambar-gambar ini di S3.

Inilah yang saat ini terjadi pada cache miss:

  1. CDN menerima permintaan untuk versi 128x128 dari sebuah gambar
  2. CDN tidak memiliki gambar itu, jadi ia meminta dari server asal Anda
  3. Server asal Anda menerima permintaan
  4. Server asal Anda mengunduh gambar asli dari S3 (mungkin gambar yang lebih besar)
  5. Asal Anda mengubah ukuran gambar itu dan mengembalikannya ke CDN
  6. CDN mengembalikan gambar itu ke pengguna dan menyimpannya

Apa yang seharusnya Anda lakukan sebagai gantinya:

Ada beberapa opsi di sini tergantung pada situasi Anda.

Berikut beberapa hal yang dapat Anda perbaiki dengan cepat, dengan pengaturan Anda saat ini:

  1. Jika Anda harus mengambil gambar asli Anda dari S3, Anda pada dasarnya membuatnya sehingga cache meleset dalam setiap pengambilan gambar lama untuk diunduh sebagai gambar ukuran asli. Jika memungkinkan, Anda harus mencoba menyimpan gambar-gambar asli itu di suatu tempat yang dapat diakses dengan cepat oleh server asal Anda. Ada jutaan pilihan berbeda di sini tergantung pada pengaturan Anda, tetapi mengambilnya dari S3 adalah yang paling lambat dari semuanya. Setidaknya Anda tidak menggunakan Glacier;).
  2. Anda tidak menyimpan gambar yang diubah ukurannya. Itu berarti bahwa setiap edge node yang digunakan Cloudfront akan meminta gambar ini, yang memicu seluruh proses pengubahan ukuran. Cloudfront mungkin memiliki ratusan server node tepi individu, yang berarti ratusan hilang dan mengubah ukuran per gambar. Tergantung pada apa yang Cloudfront lakukan untuk distribusi berjenjang, dan bagaimana Anda mengatur header file Anda mungkin tidak benar bahwa buruk, tapi itu tidak akan baik.
  3. Saya akan mengambil risiko di sini, tapi saya bertaruh Anda tidak menetapkan tajuk kedaluwarsa khusus, yang berarti Cloudfront hanya menyimpan setiap gambar ini selama 24 jam. Jika gambar Anda tidak dapat diubah setelah diunggah, Anda akan mendapatkan manfaat dari mengembalikan tajuk kedaluwarsa yang memberi tahu CDN untuk tidak memeriksa versi baru untuk waktu yang sangat lama.

Berikut adalah beberapa ide untuk pola yang berpotensi lebih baik:

  1. Ketika seseorang mengunggah gambar baru, segera transkode ke semua ukuran yang Anda dukung dan unggah ke S3. Kemudian tunjukkan CDN Anda pada bucket S3 itu. Ini mengasumsikan Anda memiliki sejumlah ukuran gambar yang didukung. Namun, saya akan menunjukkan bahwa jika Anda mendukung terlalu banyak ukuran gambar, CDN mungkin merupakan solusi yang salah sama sekali. Tingkat klik cache Anda mungkin sangat rendah sehingga CDN benar-benar menghalangi. Jika itu masalahnya, lihat poin selanjutnya.
  2. Jika Anda mendukung sesuatu seperti mengubah ukuran secara terus-menerus (misalnya, saya dapat meminta image_57x157.jpg atau image_315x715.jpg, dll. Dan server akan mengembalikannya) maka CDN Anda mungkin benar-benar merugikan Anda dengan memperkenalkan hop tambahan tanpa membebani banyak dari Anda asal. Dalam hal ini, saya mungkin akan mem-spin up contoh EC2 di semua wilayah yang tersedia, menginstal server asal Anda pada mereka, dan kemudian menukar URL gambar ke asal-usul yang sesuai secara regional berdasarkan pada IP klien (secara efektif menggulirkan CDN Anda sendiri).

Dan jika Anda ingin sekali mendorong ke Cloudfront:

Anda mungkin tidak perlu, tetapi jika Anda harus, di sini ada beberapa pilihan:

  1. Tulis skrip untuk gunakan API webpagetest.org untuk mengambil gambar Anda dari berbagai tempat berbeda di seluruh dunia. Dalam arti, Anda akan mendorong perintah tarik ke semua lokasi tepi yang berbeda. Ini tidak dijamin untuk mengisi setiap lokasi tepi, tetapi Anda mungkin bisa mendekati. Perhatikan bahwa saya tidak yakin betapa senangnya webpagetest.org akan menggunakannya dengan cara ini, tetapi saya tidak melihat apa pun di sana tentang penggunaannya (IANAL).
  2. Jika Anda tidak ingin menggunakan pihak ketiga atau berisiko menjengkelkan webpagetest.org, cukup putar turunan EC2 mikro di setiap wilayah, dan gunakan itu untuk mengambil konten, sama seperti di # 1.

5
2017-10-24 23:45



AFAIK CloudFront menggunakan S3 bucket sebagai datastore. Jadi, setelah mengubah ukuran gambar Anda harus dapat menyimpan gambar yang diubah ukurannya ke bucket S3 yang digunakan oleh CloudFront secara langsung.


2
2018-05-02 18:54