Dalam situasi apa jajak pendapat panjang / pendek AJAX lebih disukai daripada HTML5 WebSockets?

306

Saya sedang membangun aplikasi obrolan kecil untuk teman-teman, tetapi tidak yakin tentang cara mendapatkan informasi secara tepat waktu yang tidak manual atau belum sempurna seperti memaksa refresh halaman.

Saat ini, saya menerapkan ini menggunakan AJAX sederhana, tetapi ini memiliki kelemahan dari secara teratur memukul server ketika timer pendek berlalu.

Dalam meneliti polling panjang / pendek, saya menemukan HTML5 WebSockets. Ini tampaknya mudah diimplementasikan, tetapi saya tidak yakin apakah ada beberapa kelemahan tersembunyi. Misalnya, saya pikir WebSockets hanya didukung oleh browser tertentu. Apakah ada kerugian lain untuk WebSockets yang harus saya ketahui?

Karena sepertinya kedua teknologi melakukan hal yang sama, dalam skenario seperti apa yang lebih disukai seseorang untuk menggunakannya? Lebih khusus lagi, apakah HTML5 WebSockets membuat pemungutan suara panjang / pendek AJAX usang, atau adakah alasan kuat untuk memilih AJAX daripada WebSockets?

suatu hari nanti
sumber

Jawaban:

508

WebSockets jelas merupakan masa depan.

Polling panjang adalah solusi kotor untuk mencegah membuat koneksi untuk setiap permintaan seperti yang dilakukan AJAX - tetapi polling panjang dibuat ketika WebSockets tidak ada. Sekarang karena WebSockets, pemungutan suara lama akan hilang.

WebRTC memungkinkan komunikasi peer-to-peer.

Saya merekomendasikan belajar WebSockets .

Perbandingan:

berbagai teknik komunikasi di web

  • AJAX - requestresponse. Membuat koneksi ke server, mengirimkan header permintaan dengan data opsional, mendapat respons dari server, dan menutup koneksi. Didukung di semua browser utama.

  • Polling panjang - requestwaitresponse. Membuat koneksi ke server seperti yang dilakukan AJAX, tetapi mempertahankan koneksi tetap-hidup terbuka untuk beberapa waktu (tidak lama). Selama koneksi, klien terbuka dapat menerima data dari server. Klien harus menyambung kembali secara berkala setelah koneksi ditutup, karena batas waktu atau data. Di sisi server masih diperlakukan seperti permintaan HTTP, sama seperti AJAX, kecuali jawaban atas permintaan akan terjadi sekarang atau beberapa waktu di masa depan, yang ditentukan oleh logika aplikasi. grafik dukungan (lengkap) | wikipedia

  • WebSockets - clientserver. Buat koneksi TCP ke server, dan tetap buka selama diperlukan. Server atau klien dapat dengan mudah menutup koneksi. Klien melewati proses handshake yang kompatibel dengan HTTP. Jika berhasil, maka server dan klien dapat bertukar data di kedua arah kapan saja. Ini efisien jika aplikasi membutuhkan pertukaran data yang sering dalam kedua cara. WebSockets memiliki framing data yang mencakup masking untuk setiap pesan yang dikirim dari klien ke server, sehingga data hanya dienkripsi. grafik dukungan (sangat bagus) | wikipedia

  • WebRTC - peerpeer. Transport untuk menjalin komunikasi antara klien dan transport-agnostik, sehingga dapat menggunakan UDP, TCP atau bahkan lebih banyak layer abstrak. Ini umumnya digunakan untuk transfer data volume tinggi, seperti streaming video / audio, di mana keandalannya bersifat sekunder dan beberapa bingkai atau pengurangan perkembangan kualitas dapat dikorbankan demi waktu respons dan, setidaknya, beberapa transfer data. Kedua belah pihak (peer) dapat mendorong data satu sama lain secara mandiri. Meskipun dapat digunakan sepenuhnya independen dari server terpusat, masih memerlukan beberapa cara untuk bertukar data endpoint, di mana dalam banyak kasus pengembang masih menggunakan server terpusat untuk "menghubungkan" rekan-rekan. Ini diperlukan hanya untuk bertukar data penting untuk membangun koneksi, setelah itu server terpusat tidak diperlukan. grafik dukungan (sedang) | wikipedia

  • Acara yang Dikirim Server - clientserver. Klien membuat koneksi gigih dan jangka panjang ke server. Hanya server yang dapat mengirim data ke klien. Jika klien ingin mengirim data ke server, itu akan memerlukan penggunaan teknologi / protokol lain untuk melakukannya. Protokol ini kompatibel dengan HTTP dan mudah diterapkan di sebagian besar platform sisi server. Ini adalah protokol yang lebih disukai untuk digunakan daripada Polling Panjang. grafik dukungan (baik, kecuali IE) | wikipedia

Keuntungan:

Keuntungan utama dari sisi server WebSockets , adalah bahwa itu bukan permintaan HTTP (setelah jabat tangan), tetapi protokol komunikasi berbasis pesan yang tepat. Ini memungkinkan Anda untuk mencapai kinerja besar dan keunggulan arsitektur . Misalnya, di node.js, Anda dapat berbagi memori yang sama untuk koneksi soket yang berbeda, sehingga masing-masing dapat mengakses variabel bersama. Oleh karena itu, Anda tidak perlu menggunakan database sebagai titik pertukaran di tengah (seperti dengan AJAX atau Polling Panjang dengan bahasa seperti PHP). Anda dapat menyimpan data dalam RAM, atau bahkan menerbitkan ulang antar soket dengan segera.

Pertimbangan keamanan

Orang-orang sering khawatir tentang keamanan WebSockets. Kenyataannya adalah itu membuat sedikit perbedaan atau bahkan menempatkan WebSockets sebagai opsi yang lebih baik. Pertama-tama, dengan AJAX, ada kemungkinan MITM lebih tinggi , karena setiap permintaan adalah koneksi TCP baru yang melintasi melalui infrastruktur internet. Dengan WebSockets, begitu terhubung, jauh lebih sulit untuk menyadap di antara keduanya, dengan tambahan masking yang ditegakkan ketika data dialirkan dari klien ke server serta kompresi tambahan, yang membutuhkan lebih banyak upaya untuk menyelidiki data. Semua protokol modern mendukung: HTTP dan HTTPS (terenkripsi).

PS

Ingatlah bahwa WebSockets umumnya memiliki pendekatan logika yang sangat berbeda untuk jaringan , lebih seperti game real-time selama ini, dan tidak seperti http.

moka
sumber
15
Ini bukan tentang kompatibilitas itu sendiri. Paling penting bahwa itu akan memikirkan kembali sepenuhnya bagaimana komunikasi terjadi. Karena RESTful APIs bekerja dengan Request> Pattern response, komunikasi dua arah di sini tidak ada gunanya. Jadi mencoba menggunakan WebSockets untuk permintaan RESTful API - adalah upaya yang agak aneh, dan tidak dapat melihat manfaatnya sama sekali. Jika Anda memerlukan data dari RESTful API tetapi secara real-time, maka Anda membuat api WebSockets untuk mendorong data yang akan bekerja dengan komunikasi dua arah seperti WebSockets. Anda mencoba membandingkan hal-hal di sudut bahwa mereka tidak sebanding :)
moka
2
Hai @ pithhelmet semuanya tergantung pada perangkat lunak sisi server (bahasa / teknologi) itu sendiri. WebSocket adalah lapisan di atas TCP, dan ada banyak cara untuk melakukan implementasi aliran TCP. Server web modern menggunakan arsitektur berbasis acara, dan sangat efisien dengan kumpulan utas. Teknologi mana yang Anda gunakan? Node.js menggunakan peristiwa di belakang layar untuk IO, dan acara dengan utas tunggal dalam konteks eksekusi, sehingga sangat efisien. Menggunakan utas untuk setiap koneksi - sangat tidak efisien dalam hal RAM (1mb + per utas) serta CPU, karena utas tersebut hanya akan menganggur atau lebih buruk - loop tak terbatas untuk memeriksa data.
moka
4
Polling panjang bukan solusi kotor, dan ini berbeda dari webSocket. Keduanya dimaksudkan untuk digunakan dalam skenario yang berbeda.
bagz_man
5
@bagz_man Long Polling adalah penggunaan teknologi "peretasan" untuk mencapai hasil yang teknologi tidak diizinkan menurut definisi dan bukan alternatif standar yang tersedia. Alasan Long Polling ada adalah fakta bahwa WS tidak, Periode.
moka
4
@moka: Tier-bebas Cloudflare akan menyerap serangan 400 + Gbps yang berkelanjutan. Bisakah dompet Anda menyerap tagihan AWS? AWS dan Cloudflare juga memiliki pandangan yang berlawanan ketika berhadapan dengan keluhan terhadap asal Anda. Itu hanya sesuatu yang perlu diingat selama kita membahas pengorbanan. :)
danneu
11

Salah satu teknologi penantang yang Anda hilangkan adalah Server-Sent Events / Sumber Acara. Apa itu Polling Panjang, Websockets, Server-Sent Events (SSE) dan Comet? memiliki diskusi yang baik tentang semua ini. Perlu diingat bahwa beberapa di antaranya lebih mudah diintegrasikan dengan yang lain di sisi server.

bmm6o
sumber
Dari semua ini, siapa yang akan Anda sarankan untuk melihat?
Suatu hari
Saya sudah sukses dengan polling panjang, satu-satunya trik (untuk itu dan teknologi lainnya) adalah tidak mengikat utas server. Jika Anda tidak menggunakan kode server asinkron, kode itu tidak akan berskala.
bmm6o
1
@somdow Maksims-Mihejevs menjawab pertanyaan Anda dengan baik di dua paragraf pertama jawabannya. Gunakan soket web.
Jeff Sheffield
7

Untuk aplikasi obrolan atau aplikasi lain yang terus-menerus berkomunikasi dengan server, WebSocketsadalah opsi terbaik. Namun, Anda hanya dapat menggunakan WebSocketsdengan server yang mendukungnya, sehingga dapat membatasi kemampuan Anda untuk menggunakannya jika Anda tidak dapat menginstal pustaka yang diperlukan. Dalam hal ini, Anda harus menggunakan Long Pollinguntuk mendapatkan fungsionalitas serupa.

Brant Olsen
sumber
5
WebSockets didukung oleh setiap server ... Anda hanya perlu menginstal node.js atau yang serupa.
noob
9
Tweaked sedikit untuk menjelaskan bahwa ya server mana pun akan mendukung WebSockets. Namun, jika Anda menggunakan layanan hosting, Anda mungkin tidak dapat menggunakannya.
Brant Olsen
Saya menyadari utas ini agak lama tetapi ... WebSockets mungkin bukan jawaban terbaik untuk semua komunikasi dua arah. Baru-baru ini saya memperhatikan bahwa dokumentasi untuk dukungan soket web Spring 4 menunjukkan bahwa WebSockets lebih cocok untuk memindahkan data dalam jumlah besar atau latensi rendah. Jika itu tidak berlaku atau bukan prioritas maka mereka saya percaya mereka menyarankan menggunakan polling panjang. Saya tidak tahu pembenaran penuh untuk pandangan ini, saya baru tahu orang-orang Spring tahu apa yang mereka bicarakan secara umum.
Stoney
1
@Stoney terlepas dari kenyataan bahwa Anda perlu mengatur websocket di server (handler, dll.) Tidak ada alasan untuk menggunakan polling panjang di websocket. Websocket jauh lebih cepat (latensi rendah) dan memungkinkan server untuk "berbicara" dengan klien tanpa diminta oleh klien. Saat ini saya menggunakan signalr (salah satu implementasi terbaik dari websocket yang pernah dibuat menurut saya - ini berjalan pada klien dan server dan memungkinkan klien untuk memanggil metode di server dan server pada klien seolah-olah tidak ada perbedaan) pada setiap situs web yang saya buat - memuat konten dinamis, halaman tanpa dasar, dll.
DividedByZero
0

Polling XHR vs SSE vs WebSockets

  • Polling XHR Permintaan dijawab ketika acara terjadi (bisa langsung, atau setelah penundaan). Permintaan selanjutnya perlu dibuat untuk menerima acara lebih lanjut.

    Browser membuat permintaan server yang tidak sinkron, yang mungkin menunggu data tersedia sebelum merespons. Respons dapat berisi data yang disandikan (biasanya XML atau JSON) atau Javascript yang akan dieksekusi oleh klien. Di akhir pemrosesan respons, browser membuat dan mengirim XHR lain, untuk menunggu acara berikutnya. Dengan demikian browser selalu menyimpan permintaan yang luar biasa dengan server, untuk dijawab saat setiap peristiwa terjadi. Wikipedia

  • Server Terkirim Acara Klien mengirimkan permintaan ke server. Server mengirim data baru ke halaman web kapan saja.

    Secara tradisional, halaman web harus mengirim permintaan ke server untuk menerima data baru; yaitu, halaman meminta data dari server. Dengan peristiwa yang dikirim oleh server, server dapat mengirim data baru ke halaman web kapan saja, dengan mendorong pesan ke halaman web. Pesan yang masuk ini dapat diperlakukan sebagai data Acara + di dalam halaman web. Mozilla

  • WebSockets Setelah jabat tangan awal (melalui protokol HTTP). Komunikasi dilakukan dua arah menggunakan protokol WebSocket.

    Jabat tangan dimulai dengan permintaan / respons HTTP, yang memungkinkan server untuk menangani koneksi HTTP serta koneksi WebSocket pada port yang sama. Setelah koneksi dibuat, komunikasi beralih ke protokol biner dua arah yang tidak sesuai dengan protokol HTTP. Wikipedia

JSON C11
sumber