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 -
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?
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?
Saya bertanya-tanya tentang penyeimbang beban yang mengirimkan pengalihan pada permintaan awal, sehingga browser awalnya meminta
www.mydomain.com
dan dialihkan kewww34.mydomain.com
. Itu berfungsi cukup baik, sampai node turun - dan situs seperti Facebook tidak melakukannya. Bagaimana mereka melakukannya?
sumber
Jawaban:
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.
sumber
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.
Lihat: http://socket.io/docs/using-multiple-nodes/
Tetapi pada titik tertentu saya kira redis bisa menjadi penghambat ...
sumber
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
sumber