Soket web loadbalancing

104

Saya punya pertanyaan tentang cara memuat soket web keseimbangan.

Saya memiliki server yang mendukung soket web. Browser terhubung ke situs saya dan masing-masing membuka soket web www.mydomain.com. Dengan begitu, aplikasi jejaring sosial saya dapat mengirimkan pesan ke klien.

Secara tradisional, hanya dengan menggunakan permintaan HTTP, saya akan meningkatkan skala dengan menambahkan server kedua dan penyeimbang beban di depan dua server web.

Dengan soket web, koneksi harus langsung dengan server web, bukan penyeimbang beban, karena jika mesin memiliki batas fisik katakanlah 64k port terbuka, dan klien terhubung ke penyeimbang beban, maka saya tidak dapat mendukung lebih dari 64k pengguna bersamaan.

Jadi bagaimana saya -

  1. membuat klien terhubung langsung ke server web (bukan penyeimbang beban) saat halaman dimuat? Apakah saya hanya memuat JavaScript dari sebuah node, dan load balancer (atau apa pun) secara acak mengubah URL untuk skrip, setiap kali halaman awalnya diminta?

  2. menangani awal riak? Browser akan melihat bahwa koneksi ditutup saat server web dimatikan. Saya dapat menulis kode JavaScript untuk mencoba membuka kembali koneksi, tetapi node akan hilang untuk sementara waktu. Jadi saya kira saya harus kembali ke penyeimbang beban untuk menanyakan alamat node berikutnya untuk digunakan?

  3. Saya bertanya-tanya tentang penyeimbang beban yang mengirimkan pengalihan pada permintaan awal, sehingga browser awalnya meminta www.mydomain.comdan dialihkan ke www34.mydomain.com. Itu berfungsi cukup baik, sampai node turun - dan situs seperti Facebook tidak melakukannya. Bagaimana mereka melakukannya?

John Smith
sumber
1
Anda dapat memuat keseimbangan di lapisan jaringan, seperti yang disarankan di sini
Chris Snow
1
Ada juga pendekatan alternatif seperti loadbalancing berbasis DNS atau menggunakan server orkestrasi berbasis http. Saya telah mencoba meringkas sisi atas dan bawah dari setiap pendekatan di deepstream.io/blog/load-balancing-websocket-connections
wolframhempel
@wolframhempel Link sudah mati. :-(
Emile Cormier

Jawaban:

94

Letakkan penyeimbang beban L3 yang mendistribusikan paket IP berdasarkan hash sumber-IP-port ke server server WebSocket Anda. Karena penyeimbang L3 tidak mempertahankan status (menggunakan sumber-IP-port yang di-hash), penyeimbang L3 akan diskalakan ke kecepatan kabel pada perangkat keras kelas bawah (katakanlah 10 GbE). Karena distribusinya deterministik (menggunakan sumber-IP-port yang di-hash), itu akan bekerja dengan TCP (dan karenanya WebSocket).

Perhatikan juga bahwa batas keras 64k hanya berlaku untuk TCP / IP keluar untuk alamat IP (sumber) tertentu. Ini tidak berlaku untuk TCP / IP masuk. Kami telah menguji Autobahn (server WebSocket berkinerja tinggi) dengan 200k koneksi aktif pada 2 inti, RAM VM 4GB.

Perhatikan juga bahwa Anda dapat melakukan load-balancing L7 di jalur HTTP yang diumumkan selama handshake WebSocket awal. Dalam kasus tersebut, penyeimbang beban harus mempertahankan status (pasangan port IP sumber mana yang menuju ke node backend). Ini mungkin akan menskalakan hingga jutaan koneksi pada pengaturan yang layak.

Penafian: Saya penulis asli Autobahn dan bekerja untuk Tavendo.

oberstet
sumber
Jadi saya akan memuat pustaka javascript saya dari URL penyeimbang beban dan memberikan URL penyeimbang beban ketika saya membuat soket web dalam javascript - maksud Anda transparan untuk browser? Itu keren!
John Smith
1
Ya, hanya ada 1 URL, dan nama host dari yang terakhir akan menyelesaikan penyeimbang beban Anda. Server backend WebSocket memiliki IP internal (bukan publik), dan secara opsional dapat berjalan di port yang berbeda dari port publik juga. Satu-satunya peringatan adalah bahwa Anda mungkin perlu memberi tahu server WebSocket apa nama host publik mereka, IP, port, karena server WebSocket yang sesuai akan memeriksa bahwa URL yang disediakan dalam header HTTP handshake WS sesuai dengan nama host / ip / port mereka. sedang mendengarkan.
oberstet
Saya tidak memiliki banyak koneksi websocket untuk diseimbangkan tetapi saya memiliki banyak lalu lintas di satu atau mengatakan sangat sedikit koneksi. untuk kesederhanaan katakan satu koneksi sekarang bagaimana saya bisa menyeimbangkan permintaan melalui satu koneksi soket web?
pengguna1870400
Ketika saya membuat lebih banyak koneksi 5000+ di java websocket itu tidak melepaskan memori .... apakah ada solusi?
Poonam Patel
3

Perhatikan bahwa jika logika server websocket Anda berjalan di nodejs dengan socket.io, Anda dapat memberi tahu socket.io untuk menggunakan penyimpanan kunci / nilai redis bersama untuk sinkronisasi. Dengan cara ini Anda bahkan tidak perlu peduli dengan penyeimbang beban, peristiwa akan menyebar di antara instance server.

var io = require('socket.io')(3000);
var redis = require('socket.io-redis'); 
io.adapter(redis({ host: 'localhost', port: 6379 }));

Lihat: http://socket.io/docs/using-multiple-nodes/

Tetapi pada titik tertentu saya kira redis bisa menjadi penghambat ...

Konvolver
sumber
2

Anda juga dapat mencapai load balancing lapisan 7 dengan inspeksi dan "fungsi perutean"

Lihat "Cara memeriksa dan menyeimbangkan lalu lintas WebSockets menggunakan Stingray Traffic Manager, dan bila perlu, cara mengelola lalu lintas WebSockets dan HTTP yang diterima di alamat dan port IP yang sama." https://splash.riverbed.com/docs/DOC-1451

David
sumber
2
Saya harus melakukan beberapa pemeriksaan untuk menemukan info yang Anda tautkan. Mesin wayback membantu saya menemukan salinan langsung artikel itu: community.pulsesecure.net/t5/Pulse-Secure-vADC/…
Wyck