Socket.IO les performances du serveur et de l'utilisation de la bande passante
Je suis sur le point d'accueillir un petit serveur socket sur un ordinateur local et je voudrais savoir quelle est la bande passante qu'il va utiliser. Sur la plupart des jours, il n'aura pas plus de 50 clients connectés à la fois, mais une fois ou deux fois par semaine, il peut y en avoir beaucoup comme plus de 5 000 clients à la fois. Cependant, les seuls messages envoyés seront occasionnellement un seul message à tous les clients connectés à la fois, sans aucun supplément de données ou de quoi que ce soit.
Le serveur provoquer une baisse significative des performances sur l'ordinateur, il est hébergé ou ralentir ma vitesse de l'internet à tous?
Server.js:
var app = require('http').createServer(handler)
, io = require('socket.io').listen(app)
, fs = require('fs')
app.listen(8001);
function handler (req, res) {
fs.readFile(__dirname + '/index.html',
function (err, data) {
if (err) {
res.writeHead(500);
return res.end('Error loading index.html');
}
res.writeHead(200);
res.end(data);
});
}
io.sockets.on('connection', function (socket) {
socket.on('SendDefault', function(data) {
socket.broadcast.emit('GetDefault');
});
});
Client.js:
setTimeout( function( ){
socket = io.connect('[IP Address]:8001');
socket.on('GetDefault', function(data) {
DoStuff( );
);
} ); }, 10000 );
- Voir aussi: stackoverflow.com/a/12978658/201952
Vous devez vous connecter pour publier un commentaire.
La quantité de bande passante dépendra fortement de la quantité de données que vous allez envoyer à partir du serveur, et la quantité de données que le client va envoyer. L'utilisation de la bande passante dépendra aussi de quel support.IO de transport que vous utilisez et de l'intervalle de pulsation de votre application.
L'impact sur les performances de l'application varie aussi en fonction du type d'application que vous êtes en cours d'exécution et les performances de votre machine et/ou du réseau. Cependant, 5000+ les clients auront un impact considérable sur la performance, indépendamment des capacités de votre ordinateur, sauf si vous êtes mise à l'échelle de l'application sur plusieurs cœurs.
J'ai pris certaines mesures à l'aide d'un proxy. Voici les résultats:
Émettant à partir d'un client:
socket.emit(event, args)
event
etargs
ne sont pas fournis, 12 octets sont envoyés au serveur.args
est omise, maisevent
est fourni, la taille totale est de 22 octets, et la longueur deevent
.args
etevent
sont fournis, les mêmes règles sont suivies, mais les résultats peuvent varier selon le type de données deargs
.Émettant à partir du serveur: même format que le client
event
etargs
ne sont pas fournis, de 8 octets sont envoyés au client.args
est omise, maisevent
est fourni, la taille totale est de 17 octets, et la longueur deevent
.args
etevent
sont fournis, les mêmes règles sont suivies, mais les résultats peuvent varier selon le type de données deargs
.Du serveur vers le client battement de coeur: toutes les 25 secondes par client
Handshaking: une fois par client
Donc avec une charge de plus de 5 000 clients, attendez au moins 3,7 MO pour serrer la main, à 3 KO/s pour les battements de coeur, et au moins 107KB de la bande passante pour un
socket.emit()
. Ce ne sont pas des chiffres exacts, puisque les clients peuvent perdre des données, supprimer des connexions, pour se reconnecter, etc.De façon concluante, votre réseau sera probablement hold-up, mais la principale préoccupation devrait être la quantité de connexions simultanées votre réseau aura à gérer. De nombreuses connexions simultanées peuvent également être de temps CPU, de sorte que vous devrait penser à clustering sur les cœurs. Aussi garder à l'esprit la quantité de battements de coeur de la Socket.IO serveur aura à gérer. Avec 50 utilisateurs simultanés, c'est une moyenne de 2 battements par seconde. À plus de 5 000 utilisateurs simultanés, c'est plus de 200 battements par seconde, ce qui j'imagine est plus de CPU que le réseau intensif (2.8 KB/s).
WebSockets peut rester ouvert pendant un temps très long, donc de gérer un grand nombre de connexions simultanées signifie généralement que vous aurez besoin de faire évoluer ce service afin de prendre en compte l'augmentation de la charge. C'est la même chose pour presque n'importe quelle technologie, mais il y a généralement une limite pour le nombre max de connexions ouvertes un serveur peut traiter avant que les choses vont descente rapidement. Si vous êtes susceptible d'avoir de tels pics de trafic, je voudrais examiner à la recherche dans un service 3ème partie comme poussoir ou kaazing (disclaimer: je n'ai pas essayé encore.)
Vous ai posté une jolie vague question (nous ne savons rien au sujet de votre demande, l'architecture, etc. - il suffit de trafic attendu), mais j'espère que ça aide à vous diriger dans la bonne direction. Cela étant dit... en fonction de votre cas d'utilisation (diffusion d'un ou de deux petits messages de temps en temps), mon intuition me dit que les WebSockets sont pas de la bonne technologie pour vous.
(À noter que la bande passante ne devrait probablement pas être un sujet de préoccupation: d'une manière générale, si vous étiez à envoyer de nombreux messages sur les WebSockets vs RESTE vous enverrez le moins de données due à des en-têtes, les cookies, etc.)