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
IntegrationI 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, xhr-polling, 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