A guided tour of modern browser networking. We'll look at SSEs, WebSockets and WebRTC and see how to integrate them in your Ruby based app.
( This slides accompanied my talk at RubyConf India, 2014 0
Handwritten Text Recognition for manuscripts and early printed texts
Let's Get Real (time): Server-Sent Events, WebSockets and WebRTC for the soul
1. Let’s get real (time): Server-Sent
Events,WebSockets and WebRTC for
the soul
A guided tour of modern browser networking
Swanand Pagnis
swanand@pagnis.in
2. Yours truly
• Originally from Krypton, often mistaken as the last
survivor
• Sent to earth in a spaceship while still a baby
• A few useful superpowers
• Suspiciously good at hiding in plain sight
3. Yours truly
• Originally from Krypton, often mistaken as the last
survivor
• Sent to earth in a spaceship while still a baby
• A few useful superpowers
• Suspiciously good at hiding in plain sight
4. Yours truly
• Bangalore RUG, Mysore RUG, Garden City
RubyConf
• Hack code at Simplero for a living
• Twitter @_swanand
• Github @swanandp
7. 1. Why bother ?
2. The Zen of RealTime Communication
What’s in store for us
8. 1. Why bother ?
2. The Zen of RealTime Communication
3. Concepts and app Integration with:
What’s in store for us
9. 1. Why bother ?
2. The Zen of RealTime Communication
3. Concepts and app Integration with:
1. SSE
What’s in store for us
10. 1. Why bother ?
2. The Zen of RealTime Communication
3. Concepts and app Integration with:
1. SSE
2. WebSockets
What’s in store for us
11. 1. Why bother ?
2. The Zen of RealTime Communication
3. Concepts and app Integration with:
1. SSE
2. WebSockets
3. WebRTC
What’s in store for us
12. 1. Why bother ?
2. The Zen of RealTime Communication
3. Concepts and app Integration with:
1. SSE
2. WebSockets
3. WebRTC
4. Further reading and open source opportunities
What’s in store for us
14. 1. Poor performance because of high latency
2. Neither truly async nor truly real time, often
limited toText transfer only
3. Either additional complexity and inconvenience
or hacky methods
7
20. Server-Sent Events : Introduction
1. Designed for Server to Client
communication
12
21. Server-Sent Events : Introduction
1. Designed for Server to Client
communication
2. Single long lived connection;
hence low latency
12
22. Server-Sent Events : Introduction
1. Designed for Server to Client
communication
2. Single long lived connection;
hence low latency
3. Simple cross browser API
12
23. Server-Sent Events : Use cases
• Activity feeds likeTwitter, Facebook,
StockTickers
• Analytics, Dashboards, Monitoring
• Chats, Instant Messaging *,
Collaborative editing like Google Docs
13
26. Server-Sent Events : Summary
1. Simple Protocol that builds on top of HTTP
2. Truly async
3. Perfect for “notifying” the client
4. Great cross browser support, but no binary
support
16
27. 1. Traditional Rack based app are a slight misfit because
of response buffering ( Remember our first Zen ? )
2. Evented architecture works in our favour (Think of
EM::Deferrable orThin )
3. Long running connection means long running
process on the server
Server-Sent Events :App Integration
17
29. 1. Streaming and SSE support baked right into Rails
( 4.0 )
2. You keep the full context ( current_user etc )
3. Integration friendly, almost a drop-in feature into
existing Rails apps
ActionController::Live
19
32. 1. You only need Sinatra,
Thin and some Javascript
2. So simple, you will cry
with happiness
3. No app context
4. So simple, you will beg
for more features
Sinatra’s Streaming API
33. 1. You only need Sinatra,
Thin and some Javascript
2. So simple, you will cry
with happiness
3. No app context
4. So simple, you will beg
for more features
Sinatra’s Streaming API
34. 1. Running a separate process that acts as a server, and
your server and client act as clients to this server
2. Pub / sub model, drop-in integration with your app
3. Graceful degradation
4. No app context
Faye +Your App
22
36. Apps that have more traditional components than
real time
1. Use a separate process / service / app for the
real time part ( e.g. Faye or Pusher or BYOT )
2. Use existing infrastructure for non real time
aspects of the app
Recommended approach
Rant
24
42. WebSockets : Introduction
1. Standalone Bidirectional protocol
2. Message oriented, supports events by design
3. Reliable text and binary transfers
27
43. WebSockets : Introduction
1. Standalone Bidirectional protocol
2. Message oriented, supports events by design
3. Reliable text and binary transfers
4. HTTP Compatible
27
44. 1. All the use cases of SSEs, plus:
2. Multiplayer games, Multi-media chat *
3. Remote pair programming, Online contests, Live
interviews, Screen sharing, Remote Desktop etc.
WebSockets : Use Cases
28
48. Cramp +Your App
32
1. Run Cramp as a standalone app
2. Provides an app like functionality around RTC
3. Think of it as Rails for real time apps
4. No drop-in integration with existing app
49. Cramp +Your App
33
1. Controller becomes Action
2. Action becomes Event, triggered with on_data
3. params become data
4. Connection open by default
50. Recommended approach
34
Apps that are heavily real time
1. Use Cramp to build a stand alone app
2. Be an API consumer for your other app for any
additional functionality
Rant
60. WebRTC : Typical Workflow - Phase 1
43
1. Connect to the Signalling Server, let it know:
1. Your Identity ( STUN )
2. How to reach you ( ICE Candidate )
2. Once a peer is detected by the server, it in turns gives you
the above info
3. At this point, we are ready for a P2P connection
63. WebRTC : Typical Workflow - Phase II
45
1. Create a stream to send and receive binary data
2. Create a channel to send and receive text data
3. Actually send and receive data
66. WebRTC : Use Cases
48
1. Motherlode of Skype clones, free and open
source!
2. Screen sharing, remote pairing, multiplayer games,
browser based torrents, Live MOOCs
3. In reality, this is limited mostly by our imagination
and browser’s computing abilities
67. WebRTC : Dive in
49
1. Use any of the JavaScript libs / SDKs :
1. Open Source: SimpleWebRTC, webRTC.io, PeerJS,
EasyRTC, ShareFest
2. Commercial: PubNub WebRTC SDK
2. Signalling service example in Ruby
1. OSS : github.com/palavatv/palava-machine
73. • Help out Faye, Cramp and other libraries
mentioned so far
• Open source all your throw-away code written
during learning ( Mine is on Github )
• Async-proof versions of commonly needed ruby
gems ( e.g. github.com/rkh/async-rack )
74. • Helper Libraries for Cramp, e.g.
• To easily build simple board games
• To write calendar based real time apps
• Augment the testing libraries to test real time stuff
• Write and make your benchmarks available