Saat ini saya sedang mengerjakan proyek Ruby on Rails yang memperlihatkan daftar gambar.
Yang harus dimiliki untuk proyek ini adalah bahwa ia menampilkan posting baru secara realtime tanpa perlu menyegarkan halaman web. Setelah mencari sebentar, saya menemukan beberapa solusi dan layanan JavaScript seperti PubNub; Namun, tidak ada solusi yang diberikan masuk akal sama sekali.
Dalam solusi JavaScript ( polling ) terjadi hal berikut:
- Pengguna 1 melihat daftar foto.
- Di latar belakang, kode JavaScript mengumpulkan titik akhir setiap detik untuk melihat apakah ada posting baru.
- Pengguna 2 menambahkan foto baru.
- Ada penundaan 50 ms sebelum siklus baru dipicu dan mengambil data baru.
- Konten baru dimuat di DOM .
Ini tampak aneh ketika diterjemahkan ke contoh dunia nyata:
- Pengguna 1 memegang tumpukan foto di atas mejanya.
- Dia berjalan ke fotografer setiap detik dan bertanya apakah dia punya yang baru.
- Fotografer membuat foto baru.
- Detik ini ketika dia masuk, dia bisa mengambil gambar dan menaruhnya di tumpukan.
Menurut saya solusinya adalah sebagai berikut:
- Pengguna 1 memegang tumpukan foto di atas mejanya.
- Fotografer mengambil foto baru.
- Fotografer berjalan ke tumpukan dan meletakkannya dengan sisanya.
Solusi PubNub pada dasarnya sama, namun kali ini ada magang berjalan di antara para pihak untuk berbagi data.
Tidak perlu dikatakan, kedua solusi ini sangat memakan energi karena dipicu bahkan ketika tidak ada data untuk dimuat.
Sejauh pengetahuan saya, tidak ada penjelasan (logika) mengapa cara implementasi ini digunakan di hampir setiap aplikasi realtime.
Jawaban:
Mendorong berfungsi dengan baik untuk 1, atau sejumlah pengguna.
Sekarang ubah skenario dengan satu fotografer dan 1000 pengguna yang semuanya menginginkan salinan gambar. Fotografer harus berjalan ke 1000 tumpukan. Beberapa dari mereka mungkin berada di kantor yang terkunci, atau tersebar di lantai. Atau pengguna mereka sedang berlibur, dan tidak tertarik dengan gambar baru saat ini.
Fotografer akan sibuk berjalan sepanjang waktu dan tidak mengambil foto baru.
Pada dasarnya: model tarikan / jajak pendapat lebih baik untuk banyak pembaca yang tidak dapat diandalkan dengan persyaratan realtime yang longgar (jika gambar membutuhkan waktu 10 detik kemudian untuk tiba di tumpukan, apa masalahnya).
Yang mengatakan, model dorong masih lebih baik dalam banyak situasi. Jika Anda memerlukan latensi rendah (Anda memerlukan foto 5s baru setelah diambil), atau pembaruan jarang terjadi dan permintaan sering dan dapat diprediksi (terus bertanya kepada fotografer setiap 10 detik ketika ia membuat gambar baru sehari), maka menarik tidak pantas. Itu tergantung pada apa yang Anda coba lakukan. NASDAQ: dorong. Layanan cuaca: tarik. Fotografer pernikahan: mungkin menarik. Agen foto berita: mungkin mendorong.
sumber
Saya sangat terkejut bahwa hanya satu orang yang menyebutkan WebSockets . Dukungan pada dasarnya diterapkan di setiap browser utama .
Bahkan PubNub menggunakannya. Untuk aplikasi Anda, browser mungkin akan berlangganan soket yang akan disiarkan setiap kali foto baru tersedia. Soket tidak akan mengirim foto, ingatlah, tetapi hanya sebuah tautan sehingga browser dapat mengunduhnya secara tidak sinkron.
Dalam contoh Anda bayangkan sesuatu seperti:
Ini agak seperti solusi contoh asli Anda. Ini lebih efisien daripada polling karena klien tidak perlu mengirim data apa pun ke server (kecuali mungkin detak jantung .)
Juga, seperti yang disebutkan orang lain, ada metode lain yang lebih baik daripada polling sederhana yang bekerja di browser lama ( longpolling, et al .)
sumber
StackExchange
situs-situs seperti yang Anda gunakan saat ini (kecuali jika Anda melihat halaman web ini di-cache / disimpan) gunakanWebSockets
. Ini sebabnya saya juga bertanya-tanya mengapa tidak ada yang sampai @korylprince disebutkanWebSockets
.Terkadang cukup baik cukup baik.
Dari semua cara yang mungkin untuk menerapkan proses komunikasi "waktu nyata", pemungutan suara mungkin merupakan cara paling sederhana. Polling dapat digunakan secara efektif ketika interval polling relatif panjang (yaitu detik, menit atau jam daripada sesaat), dan siklus jam dikonsumsi dengan memeriksa koneksi atau sumber daya tidak terlalu penting.
sumber
Protokol HTTP terbatas karena klien HARUS yang memulai permintaan. Server tidak dapat berkomunikasi dengan klien kecuali menanggapi permintaan klien.
Jadi, untuk menyesuaikan contoh dunia nyata Anda, tambahkan pengekangan berikut:
Dengan pengekangan baru ini, bagaimana Anda melakukannya selain polling?
sumber
Mengapa pemungutan suara diterima? Karena pada kenyataannya setiap solusi sebenarnya adalah pemungutan suara tingkat rendah!
Jika server harus memperbarui Anda segera setelah gambar baru tersedia, biasanya harus memiliki koneksi ke Anda - karena alamat IP sering berubah dan Anda tidak pernah tahu jika seseorang tidak tertarik lagi, sehingga klien harus mengirim beberapa bentuk sinyal tetap-hidup, misalnya, "Aku masih di sini, aku tidak offline"
Semua koneksi stateful (misalnya, TCP / IP) bekerja sama, karena Anda hanya dapat mengirim paket data tunggal melalui Internet; Anda tidak pernah tahu apakah pihak lain masih ada di sana.
Jadi setiap protokol memiliki batas waktu. Jika suatu entitas tidak menjawab dalam X detik, itu dianggap sudah mati. Jadi, bahkan jika Anda hanya memiliki koneksi terbuka antara server dan klien, tanpa mengirim data apa pun, server dan klien harus mengirim paket tetap-hidup (ini ditangani tingkat rendah jika Anda membuka koneksi di antara mereka) - dan bagaimana ini pada akhirnya berbeda dengan polling?
Jadi pendekatan terbaik mungkin adalah longpolling:
Klien mengirim permintaan segera setelah memuat situs (misalnya, memberi tahu fotografer "Beri tahu saya jika ada gambar baru"), tetapi server tidak menjawab jika tidak ada gambar baru. Segera setelah permintaan habis, klien bertanya lagi.
Jika server sekarang memiliki gambar-gambar baru, ia dapat langsung menjawab semua klien yang mengantre untuk foto-foto baru. Jadi waktu reaksi Anda setelah gambar baru bahkan lebih pendek daripada dengan push, karena klien masih menunggu koneksi terbuka untuk balasan dan Anda tidak perlu membangun koneksi ke klien. Dan permintaan polling dari klien tidak lebih banyak lalu lintas daripada koneksi konstan antara klien dan server untuk jawaban!
sumber
Satu keuntungan dari pemungutan suara adalah bahwa itu membatasi kerugian yang dapat disebabkan jika pesan hilang atau keadaan sesuatu menjadi terganggu. Jika X meminta statusnya Y setiap lima detik, maka hilangnya permintaan atau balasan hanya akan mengakibatkan informasi X menjadi sepuluh detik kedaluwarsa daripada 5. Jika Y dibooting ulang, X dapat mengetahuinya selanjutnya waktu Y dapat menanggapi salah satu pesan X. Jika X di-reboot, mungkin tidak pernah repot meminta Y untuk apa pun sesudahnya, tetapi siapa pun yang mengamati status X harus mengakui bahwa ia telah di-reboot.
Jika alih-alih X polling Y, X mengandalkan Y untuk menginformasikannya kapan pun negaranya berubah, maka jika status Y berubah dan mengirim pesan ke X, tetapi untuk alasan apa pun pesan itu tidak diterima, X mungkin tidak akan pernah menyadari perubahan itu. . Demikian juga jika Y di-boot ulang dan tidak pernah punya alasan untuk mengirim pesan kepada X tentang apa pun.
Dalam beberapa kasus mungkin akan membantu bagi X untuk meminta Y mengirim pesan secara otonom dengan statusnya, baik secara berkala atau ketika itu berubah, dan hanya memiliki polling X jika terlalu lama tanpa mendengar apa pun dari Y. Desain semacam itu dapat menghilangkan perlu X untuk mengirim sebagian besar pesannya (biasanya, X setidaknya harus memberi tahu Y bahwa masih tertarik untuk menerima pesan, dan Y harus berhenti mengirim pesan jika terlalu lama tanpa indikasi minat). Namun, desain seperti itu akan menuntut Y untuk terus - menerusmemelihara informasi tentang X, daripada hanya mengirim balasan kepada siapa pun yang melakukan polling dan kemudian segera melupakan siapa itu. Jika Y adalah sistem tertanam, penyederhanaan seperti itu dapat membantu mengurangi kebutuhan memori secara memadai untuk memungkinkan penggunaan pengontrol yang lebih kecil dan lebih murah.
Polling dapat memiliki keuntungan tambahan saat menggunakan media komunikasi yang berpotensi tidak dapat diandalkan (mis. UDP atau radio): sebagian besar dapat menghilangkan kebutuhan akan pengakuan lapisan-link. Jika X mengirimkan Y permintaan status Q, Y merespons dengan laporan status R, dan X mendengar R, X tidak perlu mendengar segala macam pengakuan lapisan-tautan untuk Q untuk mengetahui bahwa itu diterima. Sebaliknya, begitu Y mengirim R, tidak perlu tahu atau peduli jika X menerimanya. Jika X mengirim permintaan status dan tidak mendapat respons, itu dapat mengirim yang lain. Jika Y mengirim laporan dan X tidak mendengarnya, X akan mengirim permintaan lain. Jika setiap permintaan keluar satu kali dan menghasilkan respons atau tidak, tidak ada pihak yang perlu tahu atau peduli apakah ada pesan tertentu yang diterima. Karena mengirim pemberitahuan dapat menggunakan bandwidth hampir sebanyak permintaan status atau laporan, menggunakan round-trip dari request-report tidak membutuhkan biaya lebih banyak daripada laporan dan pengakuan yang tidak diminta Jika X mengirim beberapa permintaan tanpa mendapat balasan, mungkin pada beberapa jaringan yang dialihkan secara dinamis perlu mengaktifkan pengakuan tingkat tautan (dan meminta dalam permintaannya bahwa Y juga melakukan hal yang sama) sehingga tumpukan protokol yang mendasarinya dapat mengenali masalah pengiriman dan mencari rute baru, tetapi ketika hal-hal bekerja, model laporan permintaan akan lebih efisien daripada menggunakan pengakuan tingkat tautan.
sumber
Pertanyaannya adalah untuk menyeimbangkan jumlah polling yang tidak perlu vs jumlah push yang tidak perlu.
Jika Anda polling:
Jika Anda menekan:
Ada beberapa solusi tentang bagaimana menangani berbagai skenario dan kerugiannya, seperti misalnya waktu minimum antara jajak pendapat, proksi hanya-jajak pendapat untuk mengambil beban dari sistem utama, atau - untuk dorongan - peraturan untuk mendaftar dan menentukan data yang diinginkan diikuti dengan tidak mendaftar saat log-off. Yang mana yang paling cocok yang bisa Anda katakan secara umum, itu tergantung pada sistem.
Dalam contoh Anda, pemungutan suara bukanlah solusi yang paling efisien, tetapi yang paling praktis. Sangat mudah untuk menulis sistem pemungutan suara dalam JavaScript, dan sangat mudah untuk mengimplementasikannya di sisi pengiriman juga. Server yang dibuat untuk mengirimkan data gambar harus dapat menangani permintaan tambahan, dan jika tidak, dapat ditingkatkan secara linear, karena sebagian besar data statis dan karenanya dapat dengan mudah di-cache.
Metode push yang menerapkan log-in, deskripsi data yang diinginkan dan akhirnya log-off akan menjadi paling efisien, tetapi mungkin terlalu kompleks untuk "script-kiddy" rata-rata, dan perlu menangani pertanyaan: bagaimana jika pengguna cukup matikan browser dan log-off tidak dapat dilakukan?
Mungkin lebih baik memiliki lebih banyak pengguna (karena mengaksesnya mudah) daripada menyimpan beberapa dolar pada server cache lain?
sumber
Untuk beberapa alasan, hari ini, semua pengembang web yang lebih muda tampaknya telah melupakan pelajaran dari masa lalu, dan mengapa beberapa hal telah berevolusi seperti yang mereka lakukan.
Dalam menghadapi kendala ini, Anda mungkin tidak memiliki komunikasi 2 arah yang konstan. Dan jika Anda melihat pada model OSI, Anda akan menemukan sebagian besar pertimbangan dimaksudkan untuk memisahkan ketekunan dengan koneksi yang mendasarinya.
Dengan mengingat hal itu, metode pemungutan suara untuk menarik informasi adalah cara yang bagus untuk mengurangi bandwidth dan perhitungan di sisi klien. Munculnya dorongan benar-benar sebagian besar hanya klien melakukan polling konstan, atau soket web. Secara pribadi, jika saya adalah orang lain di luar sana, saya akan menghargai keteraturan pemungutan suara sebagai sarana analisis lalu lintas, di mana permintaan GET / POST yang tidak ada waktu akan memberi sinyal kepada seseorang di tengah situasi semacam itu.
sumber