Cara yang lebih baik daripada metode pemungutan suara tradisional

10

Saya saat ini berada dalam lingkungan AngularJS / Javascript.

Saat ini aplikasi menggunakan metode polling (yaitu, untuk mengambil data baru dari server dalam jumlah detik tetap).

Ini sangat melelahkan dan tidak segera mengambil hasil terbaru. Dengan asumsi server menggunakan ASMX untuk fungsi layanan web dan jika mungkin, tanpa perombakan besar, bagaimana saya bisa lebih baik meningkatkan efisiensi aplikasi?

Edit 1:

Dengan memajaki, maksud saya server harus menarik tabel SQL yang berbeda dan data terkait dan hal-hal, yang berarti pemrosesan data yang kompleks yang jika ada banyak pengguna bersamaan saya khawatir mungkin ada masalah dengan kinerja server di masa depan.

Data terbaru tidak akan diambil karena saat ini aplikasi menggunakan jenis panggilan https permintaan-respons.

Saya dapat meningkatkan lebih banyak di sisi aplikasi mobile, tetapi tidak dapat memodifikasi banyak di sisi server selain dari file layanan web server.

Gene
sumber

Jawaban:

10

Jika dengan "tradisional" yang Anda maksud adalah setiap klien memalu server sesering mungkin maka saya dapat membantu di tingkat arsitektur.

Desain yang sesuai tergantung pada di mana server Anda berada dalam kisi ini:

Control \ Resources : Sufficient | Insufficient
Customizable        :     SC     |     IC
Untouchable         :     SU     |     IU
  • SC: Buat server mengikuti pola pengamat . Izinkan klien mendaftar sebagai pengamat.

  • IC: Hanya izinkan sistem proxy untuk mendaftar ke server. Klien mendaftar dengan proxy.

  • SU: Hanya izinkan sistem proxy menyurvei server. Klien mendaftar dengan proxy.

  • IU: Hanya izinkan sistem proxy menyurvei server. Klien mendaftar dengan proxy.

Proxy yang mengikuti pola pengamat dapat menyelesaikan masalah kustomisasi dan sumber daya. Ini berfungsi baik melalui internet seperti halnya antara objek. Ketika Anda mendaftar Anda meminta untuk dipanggil ketika sesuatu terjadi. Dengarkan pada port dan Anda siap dipanggil. ajax, REST, UDP, terserah.

Masalah dengan polling adalah bahwa pengamat mengontrol kapan panggilan terjadi namun tidak tahu kapan negara berubah sehingga membuat banyak panggilan yang tidak perlu. Ini memakan sumber daya terutama ketika ada banyak pengamat. Kunci untuk berurusan dengan pemungutan suara adalah: sesegera mungkin, dapatkan arahan panggilan dari titik perubahan negara ke pengamat. Kemudian panggilan terjadi saat dibutuhkan. Tidak ketika mereka tidak.

Jika Anda memiliki panggilan polling dengan cara ini:

  • Server <=== Banyak pengamat

Semua ini akan menjadi cara yang lebih baik untuk mendeteksi perubahan:

  • SC: Server ===> Banyak pengamat

  • IC: Server ===> Satu proxy ===> Banyak pengamat

  • SU: Server <=== Satu proksi ===> Banyak pengamat

  • IU: Server <=== Satu proksi ===> Banyak pengamat

candied_orange
sumber
7
Anda telah melewatkan skenario "perbaikan malas": cukup pasang proxy yang ringan di antara pihak-pihak dan tetap polling di mana-mana. Masalah kinerja utama kemungkinan berasal dari server melakukan banyak pekerjaan kompleks pada setiap permintaan. Dengan menggunakan proxy laju-pelambatan (nginx, memcached, dalam struktur LRU dalam memori, apa pun) harus dimungkinkan untuk mencapai tingkat respons yang lebih baik tanpa menerapkan perhitungan sisi server pada setiap permintaan Javascript.
user1643723
@CandiedOrange, dalam hal pengamat, itu akan menjadi seperti SignalR?
Gene
@Gene jika hype mereka bisa dipercaya maka ya. Mereka berbicara tentang melakukan hal yang sama.
candied_orange
6

Anda dapat menggunakan Server-Sent-Events sebagai alternatif jajak pendapat.

Alih-alih meminta server Anda untuk data baru setiap n detik, buka koneksi khusus dan minta ia mengirim data baru Anda saat tersedia!

Sambungan akan tetap terbuka sampai ditutup secara eksplisit oleh klien atau server (atau dengan penghentian mendadak mereka).

Anda dapat mengatur server Anda untuk menyiarkan data ke klien Anda pada interval tetap, atau pada waktu tertentu di server Anda (katakanlah ketika suatu objek berubah keadaan atau ketika penjadwal memecat suatu pekerjaan atau kapan).

Anda dapat menentukan berbagai jenis acara dan memiliki rutinitas yang berbeda menangani berbagai jenis acara.

Di sisi server Anda dapat menahan antrian dari pengguna yang saat ini berlangganan ke aplikasi / tipe acara Anda, ketika suatu peristiwa dibuat, server Anda akan menyiarkannya ke semua pengguna dalam antrian. Kerangka kerja seperti Jersey2 sudah menerapkan pendekatan ini menggunakan objek Broadcaster .

Di sisi klien Anda harus menulis layanan yang akan mendengarkan acara server yang dikirim pada url tertentu .

Ketika Anda akan memasuki negara / rute Anda harus berlangganan ke jenis server, dan berhenti berlangganan $destroyuntuk menghindari kebocoran.

svarog
sumber
Halo svarog, Bisakah kita mencapai multicast menggunakan server mengirim peristiwa?
kapil das
3

Itu adalah websockets: mereka adalah ekssesi HTTP, bekerja di port yang sama.

Ini memungkinkan komunikasi dua arah antara klien dan server dan tentu saja ada integrasi sudut yang tersedia untuk itu.

Kalau tidak di sisi back office, jika Anda melihat Spring di Jawa, ada cara lain untuk melakukannya:

  • Polling panjang
  • MENGINJAK
  • ...

Tautan ini covevr websocket dan metode lain disesuaikan dengan apa yang Anda butuhkan.

Perhatikan bahwa jika Anda tidak memiliki Spring / Java Anda masih harus membacanya dan mencari solusi yang setara di tumpukan teknologi Anda.

Walfrat
sumber
Berapa jumlah maksimum koneksi soket terbuka yang dapat ditangani server secara bersamaan? Apakah soket web dapat diskalakan?
thewebjackal
Yang saya tidak tahu, ada kemungkinan beberapa hal dapat memuat keseimbangan itu tetapi saya tidak mengetahuinya.
Walfrat
1

Anda perlu lebih mendefinisikan hal-hal seperti "cukup melelahkan" dan mencari tahu mengapa itu tidak segera mengambil hasil terbaru. Ini adalah pertanyaan yang mungkin terjadi terlepas dari apakah Anda polling dari klien Anda atau tidak.

Yang mengatakan, dengan front end berbasis browser, Anda pada dasarnya memiliki dua opsi jika Anda ingin tetap menggunakan javascript asli: polling (seperti yang Anda lakukan, atau mungkin polling panjang) atau soket web. Saya belum pernah melihat soket web dilakukan dengan ASMX sebelumnya (tidak mengatakan itu tidak dapat dilakukan, hanya saja saya tidak memiliki pengalaman di sana sehingga saya tidak tahu betapa sulitnya bagi Anda untuk menerapkan kembali). Selanjutnya, jika Anda mengalami masalah kinerja atau akurasi, seperti yang saya katakan, itu mungkin masih ada bahkan dengan penggunaan soket web.

Paul
sumber
hai tolong lihat pembaruan!
Gene