API Websocket untuk menggantikan REST API?

102

Saya memiliki aplikasi yang fungsi utamanya bekerja secara real time, melalui websockets atau long polling.

Namun, sebagian besar situs ditulis dengan gaya RESTful, yang bagus untuk aplikasi dan klien lain di masa mendatang. Namun, saya berpikir untuk beralih ke API websocket untuk semua fungsi situs, jauh dari REST. Itu akan memudahkan saya untuk mengintegrasikan fitur waktu nyata ke semua bagian situs. Apakah ini akan mempersulit pembuatan aplikasi atau klien seluler?

Saya menemukan bahwa beberapa orang sudah melakukan hal-hal seperti ini: SocketStream

Harry
sumber
2
Polling panjang @Stegi berfungsi cukup baik sebagai pengganti, tidak terlalu khawatir tentang itu.
Harry
2
Harry sekarang setelah 7 tahun, bagaimana hasilnya bagi Anda? Bingung, karena saya ingin pindah ke arah itu juga. @Harry
Dmitry Kudryavtsev
2
@DmitryKudryavtsev Saya akhirnya tidak melakukannya. Metode tradisional bekerja dengan baik untuk saya dan tidak jauh lebih sulit.
Harry

Jawaban:

97

Bukan untuk mengatakan bahwa jawaban lain di sini tidak pantas, mereka membuat beberapa poin bagus. Tapi saya akan menentang konsensus umum dan setuju dengan Anda bahwa pindah ke websockets untuk lebih dari sekadar fitur waktu nyata sangat menarik.

Saya serius mempertimbangkan untuk memindahkan aplikasi saya dari arsitektur RESTful ke lebih dari gaya RPC melalui websockets. Ini bukan "aplikasi mainan", dan saya tidak hanya berbicara tentang fitur waktu nyata, jadi saya punya reservasi. Tetapi saya melihat banyak manfaat dengan menempuh rute ini dan merasa ini bisa menjadi solusi yang luar biasa.

Rencana saya adalah menggunakan DNode , SocketIO , dan Backbone . Dengan alat ini, model dan koleksi Backbone saya dapat diteruskan dari / ke klien dan server hanya dengan memanggil fungsi RPC-style. Tidak perlu lagi mengelola titik akhir REST, membuat serial / deserialisasi objek, dan sebagainya. Saya belum bekerja dengan socketstream, tapi sepertinya perlu dicoba.

Saya masih harus menempuh jalan panjang sebelum saya dapat secara pasti mengatakan ini adalah solusi yang baik, dan saya yakin ini bukan solusi terbaik untuk setiap aplikasi, tetapi saya yakin bahwa kombinasi ini akan sangat kuat. Saya akui bahwa ada beberapa kekurangan, seperti kehilangan kemampuan untuk menyimpan cache sumber daya. Tapi saya merasa keuntungannya lebih besar daripada mereka.

Saya tertarik untuk mengikuti kemajuan Anda dalam menjelajahi jenis solusi ini. Jika Anda memiliki eksperimen github, tunjukkan saya padanya. Saya belum punya, tapi berharap segera.

Di bawah ini adalah daftar tautan untuk-baca-nanti yang telah saya kumpulkan. Saya tidak dapat menjamin bahwa mereka semua berharga, karena saya hanya membaca sekilas banyak dari mereka. Tapi semoga beberapa akan membantu.


Tutorial hebat menggunakan Socket.IO dengan Express. Ini mengekspos sesi ekspres ke socket.io dan membahas bagaimana memiliki ruang yang berbeda untuk setiap pengguna yang diautentikasi.

Tutorial node.js / socket.io / backbone.js / express / connect / jade / redis dengan otentikasi, Joyent hosting, dll:

Tutorial menggunakan Pusher dengan Backbone.js (menggunakan Rails):

Bangun aplikasi dengan backbone.js pada klien dan node.js dengan express, socket.io, dnode di server.

Menggunakan Backbone dengan DNode:

Tauren
sumber
1
Saya baru saja menjawab pertanyaan terkait dan menyertakan beberapa pemikiran lagi: stackoverflow.com/questions/4848642/…
Tauren
12
"Jalan saya masih panjang sebelum saya dapat secara pasti mengatakan ini adalah solusi yang baik" - Hanya ingin tahu, apakah ini benar-benar solusi yang baik? : D
inf3rno
7
Harap balas @Tauren. Saya sangat tertarik dengan apa yang Anda katakan sekarang.
No_name
4
@Tauren Saya juga ingin tahu bagaimana ini berhasil?
Kurren
57

HTTP REST dan WebSockets sangat berbeda. HTTP tidak memiliki kewarganegaraan , jadi server web tidak perlu tahu apa-apa, dan Anda mendapatkan cache di browser web dan di proxy. Jika Anda menggunakan WebSockets, server Anda menjadi stateful dan Anda harus memiliki koneksi ke klien di server.

Komunikasi Permintaan-Balasan vs Push

Gunakan WebSockets hanya jika Anda perlu PUSH data dari server ke klien, pola komunikasi tersebut tidak disertakan dalam HTTP (hanya dengan solusi). PUSH berguna jika acara yang dibuat oleh klien lain harus tersedia untuk klien lain yang terhubung, misalnya dalam permainan di mana pengguna harus bertindak atas perilaku klien lain. Atau jika situs web Anda memantau sesuatu, di mana server mendorong data ke klien sepanjang waktu, misalnya pasar saham (langsung).

Jika Anda tidak perlu PUSH data dari server, biasanya lebih mudah menggunakan server REST HTTP stateless. HTTP menggunakan pola komunikasi Request-Reply sederhana .

Jonas
sumber
5
Kami sangat terbiasa dengan pola satu arah karena kami belum pernah memiliki alternatif sebelumnya. Tapi sekarang, seiring aplikasi saya menjadi lebih berkembang, menjadi lebih jelas bagi saya bahwa semakin banyak tempat di mana teknologi push digunakan, semakin responsif, dan semakin menarik aplikasinya.
Harry
Aplikasi saya menampilkan daftar teman, dan jumlah poin yang mereka miliki, misalnya. Mengapa tidak memperbaruinya secara real time. Jika pengguna dapat melihat teman mereka maju, mereka mungkin lebih ingin mengejar ketinggalan. Saya memiliki model dokumen tertentu yang meskipun tidak sering diubah, cukup diubah sehingga tidak memperbaruinya secara real time dapat menyebabkan sedikit kebingungan. Pada titik tertentu, situs Anda cukup mendapat manfaat dari memiliki pembaruan push sehingga Anda mulai melihat kode Anda dan setengahnya tentang REST dan setengah lainnya tentang soket dan Anda berkata baik, saya ingin menyatukan ini.
Harry
3
Ini adalah opsi untuk menggunakan websockets hanya untuk mendorong pemberitahuan / perintah ke aplikasi web Anda (seperti getUpdate atau refreshObjectWithId dengan params). Perintah ini dapat dianalisis di aplikasi web Anda (klien) dan diikuti dengan permintaan istirahat untuk mendapatkan data tertentu alih-alih memindahkan data itu sendiri melalui soket web.
Beachwalker
2
Ada banyak alasan mengapa websockets bisa lebih mudah daripada panggilan REST - tidak hanya untuk push. websocket.org/quantum.html
BT
WebSockets luar biasa, dan membebaskan server untuk mengirim data klien kapan saja, tidak hanya sebagai tanggapan atas pesan klien. WebSockets mengimplementasikan protokol berbasis pesan sehingga klien dapat menerima pesan kapan saja, dan jika mereka menunggu pesan tertentu, mereka dapat mengantrekan pesan lain untuk diproses nanti, menyusun ulang pesan antrian, mengabaikan pesan yang didorong tergantung pada status aplikasi, dll. Tidak akan pernah menulis aplikasi berbasis REST lagi. Flash juga membuatnya mudah, dengan implementasi WebSocket berbasis AS3 sumber terbuka dan fallback ke browser melalui metode ExternalInterface. (AddCallback / call).
Triynko
40

Saya berpikir untuk beralih ke api WebSocket untuk semua fungsi situs

Tidak. Anda tidak harus melakukannya. Tidak ada salahnya jika Anda mendukung kedua model tersebut. Gunakan REST untuk komunikasi satu arah / permintaan sederhana & WebSocket untuk komunikasi dua arah terutama saat server ingin mengirimkan notifikasi secara real time.

WebSocket adalah protokol yang lebih efisien daripada RESTful HTTP tetapi masih skor HTTP RESTful melalui WebSocket di area di bawah ini.

  1. Buat / Perbarui / Hapus sumber daya telah ditentukan dengan baik untuk HTTP. Anda harus menerapkan operasi ini pada level rendah untuk WebSockets.

  2. Koneksi WebSocket menskalakan secara vertikal di satu server, sementara koneksi HTTP menskalakan secara horizontal. Ada beberapa solusi eksklusif berbasis non standar untuk penskalaan horizontal WebSocket.

  3. HTTP hadir dengan banyak fitur bagus seperti caching, routing, multiplexing, gzipping dll. Ini harus dibangun di atas Websocket jika Anda memilih Websocket.

  4. Pengoptimalan mesin telusur berfungsi dengan baik untuk URL HTTP.

  5. Semua Proxy, DNS, firewall belum sepenuhnya mengetahui lalu lintas WebSocket. Mereka mengizinkan port 80 tetapi mungkin membatasi lalu lintas dengan mengintipnya terlebih dahulu.

  6. Keamanan dengan WebSocket adalah pendekatan all-or-nothing.

Lihat artikel ini untuk lebih jelasnya.

Ravindra babu
sumber
3
Ini jawaban terbaik.
MattWeiler
1
Jawaban teratas untuk topik ini
Sanandrea
10

Satu-satunya masalah yang saya dapat menggunakan TCP (WebSockets) sebagai strategi pengiriman konten web utama Anda adalah bahwa hanya ada sedikit bahan bacaan di luar sana tentang bagaimana merancang arsitektur dan infrastruktur situs web Anda menggunakan TCP.

Jadi, Anda tidak bisa belajar dari kesalahan orang lain dan perkembangan akan menjadi lebih lambat. Ini juga bukan strategi yang "dicoba dan diuji".

Tentu saja Anda juga akan kehilangan semua keuntungan dari HTTP (Menjadi stateless, dan caching adalah keuntungan yang lebih besar).

Ingat bahwa HTTP adalah abstraksi untuk TCP yang dirancang untuk menyajikan konten web.

Dan jangan lupa bahwa SEO dan mesin pencari tidak membuat websockets. Jadi Anda bisa melupakan SEO.

Secara pribadi saya akan merekomendasikan hal ini karena ada terlalu banyak risiko.

Jangan gunakan WS untuk melayani situs web, gunakan WS untuk melayani aplikasi web

Namun jika Anda memiliki mainan atau situs pribadi dengan segala cara, lakukanlah. Cobalah, jadilah mutakhir. Untuk bisnis atau perusahaan, Anda tidak dapat membenarkan risiko melakukan ini.

Raynos
sumber
7

Saya belajar sedikit pelajaran (dengan cara yang sulit). Saya membuat aplikasi pengolah angka yang berjalan di layanan cloud Ubuntu AWS EC2 (menggunakan GPU yang kuat), dan saya ingin membuatnya menjadi front-end hanya untuk melihat kemajuannya secara realtime. Karena fakta bahwa itu membutuhkan data waktu nyata, jelas bahwa saya membutuhkan soket web untuk mendorong pembaruan.

Ini dimulai dengan bukti konsep, dan bekerja dengan baik. Tapi kemudian ketika kami ingin membuatnya tersedia untuk umum, kami harus menambahkan sesi pengguna, jadi kami membutuhkan fitur login. Dan tidak peduli bagaimana Anda melihatnya, websocket harus mengetahui pengguna mana yang dihadapinya, jadi kami mengambil jalan pintas menggunakan websockets untuk mengautentikasi pengguna . Tampaknya jelas, dan nyaman.

Kami benar-benar harus meluangkan waktu untuk membuat koneksi dapat diandalkan. Kami memulai dengan beberapa tutorial websocket murah, tetapi menemukan bahwa implementasi kami tidak dapat terhubung kembali secara otomatis ketika koneksi terputus. Itu semua membaik saat kami beralih ke socket-io. Socket-io adalah suatu keharusan!

Karena itu, sejujurnya, saya pikir kami melewatkan beberapa fitur socket-io yang hebat. Socket-io memiliki lebih banyak hal untuk ditawarkan, dan saya yakin, jika Anda memperhitungkannya dalam desain awal Anda, Anda bisa mendapatkan lebih banyak darinya. Sebaliknya, kami hanya mengganti websockets lama dengan fungsionalitas websocket dari socket-io, dan hanya itu. (tidak ada kamar, tidak ada saluran, ...) Desain ulang bisa membuat segalanya lebih kuat. Tapi kami tidak punya waktu untuk itu. Itu adalah sesuatu yang perlu diingat untuk proyek kita selanjutnya.

Selanjutnya kami mulai menyimpan lebih banyak data (riwayat pengguna, faktur, transaksi, ...). Kami menyimpan semuanya dalam database dynamodb AWS, dan LAGI, kami menggunakan socket-io untuk mengomunikasikan operasi CRUD dari front-end ke backend. Saya pikir kami salah belok di sana. Itu adalah sebuah kesalahan.

  • Karena tak lama setelah kami mengetahui bahwa layanan cloud Amazon (AWS) menawarkan beberapa alat penyeimbang / penskalaan beban yang hebat untuk aplikasi RESTful .
  • Kami mendapat kesan sekarang bahwa kami perlu menulis banyak kode untuk melakukan jabat tangan operasi CRUD.
  • Baru-baru ini kami menerapkan integrasi Paypal. Kami berhasil membuatnya bekerja. Tapi sekali lagi, semua tutorial melakukannya dengan RESTful API . Kami harus menulis ulang / memikirkan kembali contoh mereka untuk mengimplementasikannya dengan websockets. Kami membuatnya bekerja cukup cepat. Tapi rasanya kita melawan arus.

Karena itu, kami akan live minggu depan. Kami tiba di sana tepat waktu, semuanya bekerja. Dan itu cepat, tetapi apakah itu akan meningkat?

bvdb.dll
sumber
Hanya bertanya-tanya ketika kami mencoba membuat keputusan ini sendiri, apakah itu berskala baik dengan AWS?
Gabe
1
@Gabe tampaknya node dapat dengan mudah mengambil 100 koneksi socket-io pada instance aws yang murah. Kami belum melihat masalah kinerja apa pun. Salah satu efek anehnya, adalah bahwa orang yang mengunjungi situs web Anda sekali, tetapi kemudian membiarkan situs web tersebut terbuka di tab, terus menggunakan koneksi. (dan itu sering terjadi pada ponsel). Jadi, Anda membutuhkan setidaknya semacam mekanisme untuk mengusir pengguna yang menganggur. Saya belum berusaha keras untuk melakukan itu, karena penampilan kami tidak menderita sama sekali. - Jadi, tidak perlu ada scalling.
bvdb
4

Saya akan mempertimbangkan untuk menggunakan keduanya . Setiap teknologi memiliki kelebihannya masing-masing dan tidak ada satu solusi yang cocok untuk semua.

Pemisahan pekerjaan berjalan seperti ini:

  1. WebSockets akan menjadi metode utama aplikasi untuk berkomunikasi dengan server di mana sesi diperlukan. Ini menghilangkan banyak peretasan yang diperlukan untuk peramban lama (masalahnya adalah dukungan untuk peramban lama yang akan menghilangkan ini)

  2. RESTful API digunakan untuk panggilan GET yang tidak berorientasi pada sesi (misalnya, tidak diperlukan otentikasi) yang memanfaatkan cache browser. Contoh yang bagus dari ini adalah data referensi untuk drop down yang digunakan oleh aplikasi web. Namun. dapat berubah sedikit lebih sering daripada ...

  3. HTML dan Javascript. Ini terdiri dari UI aplikasi web. Ini umumnya akan menguntungkan ditempatkan pada CDN.

  4. Layanan Web yang menggunakan WSDL masih merupakan cara terbaik untuk komunikasi antar-perusahaan dan tingkat perusahaan karena WSDL menyediakan standar yang ditentukan dengan baik untuk penyampaian pesan dan data. Terutama Anda akan memindahkan ini ke perangkat Datapower ke proxy ke penangan layanan web Anda.

Semua ini terjadi pada protokol HTTP yang sudah memberikan penggunaan soket aman melalui SSL.

Untuk aplikasi seluler, websockets tidak dapat menyambungkan kembali ke sesi terputus ( Cara menyambungkan kembali ke websocket setelah koneksi dekat ) dan mengelola itu tidak sepele. Jadi untuk aplikasi seluler , saya tetap akan merekomendasikan REST API dan polling.

Hal lain yang harus diperhatikan saat menggunakan WebSockets vs REST adalah skalabilitas . Sesi WebSocket masih dikelola oleh server. RESTful API bila dilakukan dengan benar bersifat stateless (yang berarti tidak ada status server yang perlu dikelola), sehingga skalabilitas dapat tumbuh secara horizontal (yang lebih murah) daripada secara vertikal .

Archimedes Trajano
sumber
2

Apakah saya ingin pembaruan dari server?

  • Ya: Socket.io
  • Tidak ada istirahat

Kerugian dari Socket.io adalah:

  • Skalabilitas: WebSockets memerlukan koneksi terbuka dan penyiapan Ops yang jauh berbeda dengan skala web.
  • Learnin: Saya tidak punya waktu tak terbatas untuk belajar saya. Hal-hal harus diselesaikan!

Saya masih akan menggunakan Socket.io dalam proyek saya, tetapi tidak untuk formulir web dasar yang akan dilakukan REST dengan baik.

Michael Cole
sumber
1

Transport berbasis WebSockets (atau long polling) sebagian besar berfungsi untuk (hampir) komunikasi waktu nyata antara server dan klien. Meskipun ada banyak skenario di mana jenis transportasi ini diperlukan, seperti obrolan atau semacam umpan waktu nyata atau hal-hal lain, tidak semua bagian dari beberapa aplikasi web perlu dihubungkan secara dua arah dengan server.

REST adalah arsitektur berbasis sumber daya yang dipahami dengan baik dan menawarkan keunggulannya sendiri dibandingkan arsitektur lain. WebSockets lebih condong ke aliran / umpan data secara real-time yang mengharuskan Anda membuat semacam logika berbasis server untuk memprioritaskan atau membedakan antara sumber daya dan umpan (jika Anda tidak ingin menggunakan REST).

Saya berasumsi bahwa pada akhirnya akan ada lebih banyak kerangka kerja WebSockets sentris seperti socketstream di masa depan ketika pengangkutan ini akan lebih luas dan lebih dipahami / didokumentasikan dalam bentuk tipe data / bentuk pengiriman agnostik. Namun, menurut saya, ini tidak berarti bahwa itu akan / harus menggantikan REST hanya karena ia menawarkan fungsionalitas yang tidak selalu diperlukan dalam banyak kasus dan skenario penggunaan.

yojimbo87
sumber
0

Saya ingin menunjukkan entri blog ini yang menurut saya, jawaban terbaik untuk pertanyaan ini.

Singkatnya, YA

Postingan tersebut berisi semua praktik terbaik untuk jenis API semacam itu.

David D.
sumber
-1

Itu bukan ide yang bagus. Standar ini bahkan belum diselesaikan, dukungan bervariasi di semua browser, dll. Jika Anda ingin melakukan ini sekarang, Anda harus kembali ke flash atau polling yang lama, dll. Di masa mendatang mungkin masih tidak akan membuat masuk akal, karena server harus mendukung meninggalkan koneksi terbuka untuk setiap pengguna. Sebagian besar server web dirancang untuk unggul dalam menanggapi permintaan dengan cepat dan menutupnya secepat mungkin. Bahkan sistem operasi Anda harus disetel untuk menangani sejumlah besar koneksi simultan (setiap koneksi menggunakan lebih banyak port dan memori sementara). Tetap gunakan REST untuk situs sebanyak yang Anda bisa.

zeekay
sumber
Ya, sebagian besar layanan web unggul di HTTP. Tetapi node.js bukanlah server web, ini adalah perpustakaan io. Itu bisa melakukan TCP dengan baik. Pertanyaannya pada dasarnya adalah bisakah kita merancang situs web untuk menggunakan TCP, bukan HTTP.
Raynos
Pembatasan yang sama berlaku, Anda masih akan kehabisan port / memori sementara, masih akan membatasi berapa banyak orang yang dapat Anda layani secara bersamaan, dan menempatkan beban yang tidak perlu pada sistem.
zeekay
ya ada batasannya, tetapi menurut saya bukan masalah besar jika Anda tidak membuat utas baru per sambungan.
Raynos
Saya sudah memiliki soket untuk setiap pengguna. obrolan global + umpan berita.
Harry
1
Saya kira pada tahun 2011 ini adalah jawaban yang bagus. - Jadi, saya melihat dari mana Anda berasal. Namun di tahun 2019, websockets telah matang.
bvdb