Real-time Web Application with
Socket.IO, Node.js, and Redis
York Tsai, JSDC 2013
Who is York
●

http://www.linkedin.com/pub/york-tsai/13/bb/8a8

●

https://twitter.com/yorktsai

●

https://www.facebook.com/yorktsai

●

VP Engineering @ EZTABLE
Never Live Demo!
●

http://jsdc.york.tw/

●

I hope this work on my (and yours) computer ...
You may Have Heard About
●

Forever Iframe

●

XMLHttpRequest Long Polling

●

Cometd

●

Websocket

●

●

http://en.wikipedia.org/wiki/Comet_(programming
)
TL;DR
Socket.IO
●
●

Cross browser (including IE 6)
Real-time and bi-directional persistent
connection (WebSocket)

●

Very simple to use

●

Javascript!
Start a Server
Sending and
Receiving Events
Select Receivers for
Events
Broadcasting
Rooms
Single Target
Multiple Applications?
Namespacing
How About New
Connections?
Data Persistence
●
●

Need a persistence layer
Get data from the persistence layer whenever a
new connection established
Integration
I have component X,Y,Z want to send/receive data
from user's browser
Pub/Sub or Message
Queue
Messaging system usually supports both
Pub/Sub

Digram from Python's Website
Redis
●

Super-fast in-memory data structure server

●

Pub/Sub

●

Rich client libraries

●

Zero install and easy to operate
3 Commands
●

SUBSCRIBE channel

●

UNSUBSCRIBE channel

●

PUBLISH channel message
In addition...
●

●

Connect multiple node.js server to one redis
channel
Scalability!
Two Connections per Server
Redis-backed Pub/Sub
●
●

Two clients required: one for pub, one for sub
Use one channel, add metadata to your
message
Redis-backed Pub/Sub
Frequently Asked
Questions
SSL?
Yes!
SSL Server
SSL Client
Cross domain?
Yes! (If use WebSocket or
JSONP)
Authentication?
Authentication
●
●

Cookie & Session
Cookie does not cross domain, use SSL +
Access Token instead
Load Balancing?
Yes! (If use Nginx >= 1.3.13)
Sample Nginx Configuration
Load Balancing using ELB
●

ELB (Elastic Load Balancer)'s HTTP(S) proxy
does not understand websocket requests

●

Use TCP/SSL, instead of HTTP/HTTPS

●

No session stickyness

●

No X-Forwarded-For header
Scalability
●

Single thread

●

2500~3500 connections per process

●

As many processes as you want
Configurations
●

●

●

store (default: MemoryStore, single process
only)
transports (default: websocket, htmlfile, xhrpolling, jsonp-polling)
authorization (default: false)
Configurations - transports
Thank You!
The slide is also the live demo itself. Please check
the following repo!
https://github.com/yorktsai/jsdc2013

Real-time Web Application with Socket.IO, Node.js, and Redis