Yük dengeleme web soketleri


104

Web soketlerini dengeleme ile ilgili bir sorum var.

Web soketlerini destekleyen bir sunucum var. Tarayıcılar siteme bağlanır ve her biri için bir web soketi açar www.mydomain.com. Bu şekilde, sosyal ağ uygulamam müşterilere mesaj gönderebilir.

Geleneksel olarak, yalnızca HTTP isteklerini kullanarak, iki web sunucusunun önüne ikinci bir sunucu ve bir yük dengeleyici ekleyerek ölçeklendirirdim.

Web soketleriyle, bağlantı yük dengeleyicilerle değil, doğrudan web sunucusuyla olmalıdır, çünkü bir makinenin fiziksel sınırı 64k açık bağlantı noktalarına sahipse ve istemciler yük dengeleyiciye bağlanıyorsa, destekleyemezdim 64 binden fazla eşzamanlı kullanıcı.

Peki ben nasıl -

  1. sayfa yüklendiğinde istemcinin doğrudan web sunucusuna (yük dengeleyici yerine) bağlanmasını sağlayın? JavaScript'i bir düğümden yüklüyor muyum ve yük dengeleyiciler (veya her neyse), sayfa her istendiğinde komut dosyası için URL'yi rastgele değiştiriyor mu?

  2. bir dalgalanma başlangıcıyla başa çıkmak mı? Tarayıcı, web sunucusu kapandığında bağlantının kapandığını fark edecektir. Bağlantıyı yeniden açmayı denemek için JavaScript kodu yazabilirim, ancak düğüm bir süreliğine gitmiş olacak. Öyleyse, kullanmak için bir sonraki düğümün adresini sorgulamak için yük dengeleyiciye geri dönmem gerekeceğini tahmin ediyorum?

  3. Yük dengeleyicilerin ilk istek üzerine bir yönlendirme gönderdiğini merak ettim, böylece tarayıcı başlangıçta talep eder www.mydomain.comve yönlendirilir www34.mydomain.com. Bu, düğüm kapanana kadar oldukça iyi çalışır - ve Facebook gibi siteler bunu yapmaz. Nasıl yapıyorlar?



1
DNS tabanlı yük dengeleme veya http tabanlı düzenleme sunucusu kullanma gibi alternatif yaklaşımlar da vardır. Deepstream.io/blog/load-balancing-websocket-connections
wolframhempel

@wolframhempel Link öldü. :-(
Emile Cormier

Yanıtlar:


94

IP paketlerini kaynak IP bağlantı noktası karmasına dayalı olarak WebSocket sunucu grubunuza dağıtan bir L3 yük dengeleyici koyun. L3 dengeleyici hiçbir durumu korumadığından (karma kaynak IP bağlantı noktasını kullanarak), düşük kaliteli donanımda (örneğin 10GbE) kablo hızına ölçeklenecektir. Dağıtım deterministik olduğundan (karma kaynak-IP-portu kullanılarak), TCP (ve dolayısıyla WebSocket) ile çalışacaktır.

Ayrıca, 64k sabit sınırın yalnızca belirli bir (kaynak) IP adresi için giden TCP / IP için geçerli olduğunu unutmayın . Gelen TCP / IP için geçerli değildir. Autobahn'ı (yüksek performanslı bir WebSocket sunucusu) 2 çekirdekli, 4GB RAM VM'de 200k aktif bağlantıyla test ettik .

Ayrıca, ilk WebSocket anlaşması sırasında duyurulan HTTP yolunda L7 yük dengeleme yapabileceğinizi unutmayın. Bu durumda, yük dengeleyicinin durumu (hangi kaynak IP bağlantı noktası çiftinin hangi arka uç düğümüne gittiğini) sürdürmesi gerekir. Yine de düzgün kurulumda muhtemelen milyonlarca bağlantıya ölçeklenecektir.

Feragatname: Autobahn'ın orijinal yazarıyım ve Tavendo için çalışıyorum.


Bu yüzden javascript kitaplığımı yük dengeleyici URL'sinden yükler ve javascript'te web soketini oluşturduğumda yük dengeleyici URL'sini veririm - yani tarayıcı için şeffaf mıdır? Bu süper!
John Smith

1
Evet, yalnızca 1 URL vardır ve ikincisinin ana bilgisayar adı yük dengeleyicinize çözülmelidir. WebSocket arka uç sunucusunun dahili IP'leri vardır (herkese açık değildir) ve isteğe bağlı olarak genel olandan farklı bağlantı noktalarında da çalışabilir. Tek uyarı, WebSocket sunucularına genel görünür ana bilgisayar adı olan IP bağlantı noktasının ne olduğunu söylemeniz gerekebileceğidir, çünkü uyumlu WebSocket sunucuları, WS el sıkışmasının HTTP başlığında sağlanan URL'nin ana bilgisayar adı / ip / bağlantı noktasına uyup uymadığını kontrol edecektir. dinliyorlar.
oberstet

Dengeleyecek çok fazla websocket bağlantım yok, ancak bir veya çok az bağlantıda çok fazla trafik var. basitleştirmek için bir bağlantı söyleyin şimdi bir web soket bağlantısından geçen istekleri nasıl dengeleyebilirim?
user1870400

Java websocket içinde 5000+ daha fazla bağlantı yaptığımda belleği serbest bırakmıyor .... herhangi bir çözüm var mı?
Poonam Patel

3

Websocket sunucusu mantığınız socket.io ile nodejs üzerinde çalışıyorsa, socket.io'ya eşitleme için paylaşılan bir redis anahtarı / değer deposu kullanmasını söyleyebilirsiniz. Bu şekilde, yük dengeleyiciyle ilgilenmenize bile gerek kalmaz, olaylar sunucu örnekleri arasında yayılır.

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

Bakınız: http://socket.io/docs/using-multiple-nodes/

Ancak bir noktada redis darboğaz haline gelebilir ...


2

Ayrıca inceleme ve "yönlendirme işlevi" ile katman 7 yük dengeleme elde edebilirsiniz.

Bkz. "Stingray Traffic Manager kullanılarak WebSockets trafiği nasıl incelenir ve yük dengelenir ve gerektiğinde, aynı IP adresi ve bağlantı noktasında alınan WebSockets ve HTTP trafiği nasıl yönetilir." https://splash.riverbed.com/docs/DOC-1451


2
Bağladığınız bilgiyi bulmak için biraz detaya gitmem gerekti. Geri dönüş makinesi, bu makalenin canlı bir kopyasını bulmama yardımcı oldu: community.pulsesecure.net/t5/Pulse-Secure-vADC/…
Wyck
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.