WEBSOCKETS IN NODE.JS
WEBSOCKETS IN NODE.JS
ABOUT ME
• GARETH MARLAND
• @GARETHMARLAND
• HTTPS://GITHUB.COM/GMARLAND (EXAMPLE CODE)
• HTTP://WWW.DOTSTORMING.COM
WHAT SHOULD WE CONSIDER?
• RELIABILITY
• SCALABILITY
• HOSTING
HOW CAN WE IMPLEMENT THEM?
• SOCKET.IO – MOST POPULAR BUT LEAST RELIABLE
• SOCKJS – A REASONABLE ALTERNATIVE
• ENGINE.IO – RELIABLE BUT LOW LEVEL
EXAMPLE – IMPLEMENTING IN ENGINE.IO
function connectSocket() { socket = eio("http://localhost:8080/");
socket.onopen = function() { socket.onmessage = function(package) { // Handling received messages }; };
socket.onclose = function() { console.log("Disconnected from websocket"); connectionAttempts++;
if (connectionAttempts < 10) { connectSockets(); } }}
SETTING THE CONNECTION ON THE CLIENT
function sendMessage(action, data) {var socketPackage = { action: action, data: data }this.socket.send(JSON.stringify(socketPackage));
}
var newMessage = {owner: “Gareth”,message: “Hello there”
}
var action = “greetings”;
sendMessage(action, data);
SENDING AN OBJECT FROM THE CLIENT
socket.on('connection', function (client) { client.send('123456');
client.on('message', function (data) { for (var key in socket.clients ) { if(typeof client.id !== 'undefined') { if(key == client.id) { continue; } } socket.clients[key].send(data); } });});
LISTENING ON THE SERVER
var app = express();
app.configure(function() { app.use(function(req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "X-Requested-With"); next(); });});
REMEMBER TO ALLOW CROSS DOMAINS IN EXPRESS!
function connectSockets() { socket = eio(‘http://localhost:8080/’);
socket.onopen = function() { socket.onmessage = function(package) { var socketPackage = JSON.parse(package.data);
if (socketPackage.action != null) { switch(socketPackage.action) { case ‘greetings’:
console.log(socketPackage.data.message); break; } } }; };}
RECEIVING AN OBJECT ON THE CLIENT
RELIABLE WEBSOCKETS!
PROBLEMS WITH SCALING
• WEBSOCKETS REQUIRE “STICKY SESSIONS”
• WEBSOCKETS ONLY EXIST ON THE SERVER THE CLIENT CONNECTED TO
CLIENTS CAN’T PASS MESSAGESBETWEEN SERVERS!
REDIS TO THE RESCUE!
• REDIS HAS A PUB/SUB QUEUE
• HAVE ALL OUR SERVER INSTANCES PUBLISHING AND SUBSCRIBING TO THE QUEUE
• PASS MESSAGES BETWEEN SERVERS USING THE QUEUE
PASSING MESSAGES WITH REDIS
var pub = redis.createClient();
socket.on('connection', function (client) { client.send('123456'); client.on('message', function (data) {
try { pub.publish('subscription-channel', data); } catch (err) { console.log("Error publishing: " + err); }
});});
PUBLISH A RECEIVED MESSAGE THROUGH REDIS
var sub = redis.createClient();
sub.on('ready', function() {
sub.subscribe('subscription-channel');
sub.on('message', function(channel, message) {
for( var key in socket.clients ) { socket.clients[key].send(message); }
});
});
RECEIVING A MESSAGE FROM REDIS
SCALABLE WEBSOCKETS!
THANK YOU!