Apakah ide yang baik untuk menggabungkan beberapa permintaan HTTP untuk menghemat bandwidth?

16

Saya sedang menyiapkan aplikasi satu halaman yang kadang-kadang akan digunakan melalui koneksi seluler yang lambat. Beberapa bagiannya cukup berat dalam hal permintaan API (mengambil sepuluh sumber daya yang berbeda untuk tampilan layar baru).

Sekarang, apakah ide yang baik untuk menggabungkan layanan ini ke layanan yang menyediakan semua data yang diperlukan, tetapi tidak "murni" dalam hal prinsip REST? Apakah ada keuntungan kinerja yang signifikan yang diharapkan?

Lukáš Lánský
sumber
3
"Ide bagus" adalah ide yang memenuhi persyaratan kinerja dan pemeliharaan perangkat lunak Anda secara memadai.
Robert Harvey
1
Manfaat menggabungkan respons mungkin sebenarnya tidak terlalu signifikan meskipun setelah Anda memastikan untuk menggunakan keep-live dan memastikan permintaan yang dapat dimuat secara paralel dimuat tanpa memblokir satu sama lain. Mengukur, mengukur, mengukur. Jangan menebak.
Lie Ryan
LAKUKAN, itu tidak hanya menghemat bandwidth Anda, itu juga akan memungkinkan Anda untuk menyusun ulang operasi IO sehingga Anda telah meningkatkan kinerja IO. Ini akan sering menjadi leher botol dalam suatu sistem dan akan sangat meningkatkan throughput.
InformedA

Jawaban:

18

Salah satu keuntungan dari REST adalah kemampuan untuk me-cache permintaan melalui cache http tradisional (dengan asumsi bahwa ini adalah permintaan cacheable).

Saat Anda memiliki permintaan tunggal, lebih besar, lebih jarang digunakan, dan mungkin berbeda (saya akan mengambil item a,b,c,dkali ini dan item a,b,d,elain kali), Anda membuat permintaan lebih cenderung menjadi cache miss dan dikeluarkan dari cache yang mungkin duduk di suatu tempat antara Anda dan sumbernya.

Mengingat dua set permintaan yang disebutkan di atas, permintaan kedua mungkin memiliki tingkat hit cache 75% dan secara substansial lebih cepat mengambil hanya e, daripada keempat hal.

Perhatikan bahwa ini mungkin tidak segera terlihat oleh orang-orang yang menggunakannya karena orang yang melakukan set permintaan cache yang pertama masih akan kehilangan cache.

Ini bukan untuk mengatakan bahwa itu akan ideal pada koneksi jaringan seluler di mana orang cenderung mendapatkan hit cache non-lokal. Tetapi untuk hot spot atau situasi wifi lainnya, hit cache bisa jauh lebih berguna.

Sebagian besar dari ini, sekali lagi, tergantung pada bagaimana aplikasi Anda bekerja. Apakah ini meminta semua data ini saat startup? atau apakah kita berbicara tentang memuat halaman di mana harapan waktu respons berbeda?

Hal yang ideal untuk dilakukan adalah mengujinya untuk melihat bagaimana aplikasi Anda terbentuk sebelumnya dalam berbagai situasi. Pertimbangkan untuk menyiapkan situasi di mana Anda telah mengikat perangkat seluler Anda ke jaringan wifi lokal yang dapat Anda pantau (yang merupakan hit pertama di google) dan mensimulasikan koneksi internet yang buruk untuk melihat bagaimana hal-hal sebenarnya bekerja (atau tidak) dan mana yang memiliki kinerja terbaik.

Komunitas
sumber
1
+1 untuk menyebutkan caching. Semakin banyak sumber daya yang Anda minta dalam suatu permintaan, semakin tinggi kemungkinan miss cache, tetapi semakin sedikit HTTP overhead.
Brandon
8

Intuisi Anda agak benar - pada umumnya membuat lebih sedikit permintaan tentu lebih disukai; API chunky cenderung lebih baik. Terutama dengan konektivitas jerawatan di mana Anda dapat melihat beberapa pekerjaan dan beberapa gagal membuat skenario fallback mimpi buruk karena tidak ada yang bisa bergantung pada apa pun.

Ada satu peringatan besar - Anda bisa mendapatkan terlalu chunky dan panggilan dan tanggapan Anda menjadi membengkak. Misalnya, masuk akal untuk melakukan satu panggilan besar ketika Anda pertama kali menekan halaman dan kemudian memiliki aliran pembaruan dalam gigitan yang lebih kecil daripada memaksa refresh halaman besar setiap kali Anda menginginkan data.

Atau, Anda ingin melakukan keduanya dengan segala kemungkinan.

Wyatt Barnett
sumber
5

Lihat artikel Blog Tech Dropbox ini .

Di sana mereka menjelaskan secara rinci tentang mengapa dan bagaimana mereka menerapkan solusi yang Anda usulkan untuk mengambil thumbnail untuk semua gambar Anda. Harus dikatakan bahwa mereka mengukur kinerja untuk melihat apakah itu sepadan dengan masalah, dan ternyata itu benar.

Ringkasan singkat:

Situs web Dropbox harus memuat ratusan thumbnail. Karena keterbatasan di beberapa browser, tidak semua thumbnail dimuat secara paralel (permintaan di-antri). Mereka ingin menggunakan SPDY , tetapi tidak dapat melakukannya karena bagian dari sistem mereka belum mendukungnya. Pada akhirnya mereka menggunakan permintaan batch melalui HTTP, yang mengembalikan beberapa thumbnail per respons dalam bentuk terkompresi. Peningkatan waktu pemuatan halaman keseluruhan adalah 40% sesuai dengan hasil mereka.

jmiserez
sumber
Tetapi mereka mengatakan itu solusi sementara.
ymajoros
3

Singkatnya: Pendekatan Anda agak benar dan dapat mengambil manfaat dari Layanan pembungkus.

Layanan ini akan menggabungkan panggilan tunggal yang ada menjadi satu metode sisi layanan. Lakukan itu dengan menggabungkan panggilan dari klien ke sisi layanan & memanfaatkan semua panggilan tunggal, atomik, dan tenang yang mungkin sudah Anda miliki sekarang.

Dengan demikian, Anda akan terus mendapat manfaat dari REST sebagai kemampuan untuk men-cache permintaan.

Namun, pada titik akhir semuanya akan bermuara pada kinerja infrastruktur layanan / server dan lingkungan klien yang harus mengkonsumsinya.

Yusubov
sumber