RealTime Web with PocketIO

36
Tel Aviv Perl Mongers Realtime Web with PocketIO Ynon Perek Wednesday, November 28, 12

description

PocketIO is perl's implementation for socket.io, a realtime web library originally written in JS. In this keynote I present the concepts of real-time web, and how to use it in perl

Transcript of RealTime Web with PocketIO

Page 1: RealTime Web with PocketIO

Tel Aviv Perl Mongers

Realtime Web with PocketIOYnon Perek

Wednesday, November 28, 12

Page 2: RealTime Web with PocketIO

Whoami

✤ Ynon Perek

✤ ynonperek.com

[email protected]

Wednesday, November 28, 12

Page 3: RealTime Web with PocketIO

Agenda

✤ What’s wrong with HTTP

✤ Real Time Web - Concepts

✤ PocketIO Coding Demos

Wednesday, November 28, 12

Page 4: RealTime Web with PocketIO

What is wrong with HTTP ?

Here It Is

GET page

Wednesday, November 28, 12

Page 5: RealTime Web with PocketIO

Let’s try a Live Chat

Wednesday, November 28, 12

Page 6: RealTime Web with PocketIO

HTTP Live Chat

✤ All communication is mediated by server using HTTP

Tell Laura I Love Her

Wednesday, November 28, 12

Page 7: RealTime Web with PocketIO

HTTP Live Chat

✤ But the server can only reply ...

Ok, got it

Wednesday, November 28, 12

Page 8: RealTime Web with PocketIO

HTTP Live Chat

✤ Waiting...

Wednesday, November 28, 12

Page 9: RealTime Web with PocketIO

HTTP Live Chat

✤ Meantime, on Laura’s side

Do I have any messages ?

Tommy said he loves you

Wednesday, November 28, 12

Page 10: RealTime Web with PocketIO

A second later

Wednesday, November 28, 12

Page 11: RealTime Web with PocketIO

HTTP Live Chat

Do I have any new messages ?

No, sorry

Wednesday, November 28, 12

Page 12: RealTime Web with PocketIO

A second later

Wednesday, November 28, 12

Page 13: RealTime Web with PocketIO

HTTP Live Chat

Do I have any new messages ?

No, sorry

Wednesday, November 28, 12

Page 14: RealTime Web with PocketIO

A second later

Wednesday, November 28, 12

Page 15: RealTime Web with PocketIO

HTTP Live Chat

Do I have any new messages ?

No, sorry

Wednesday, November 28, 12

Page 16: RealTime Web with PocketIO

HTTP Live Chat Dark Side

✤ Server is busy picking up requests

✤ Clients are busy polling

✤ Everyone loses

Wednesday, November 28, 12

Page 17: RealTime Web with PocketIO

Real Time Web

✤ Improved UX by allowing the server to notify a client

Wednesday, November 28, 12

Page 18: RealTime Web with PocketIO

What’s Available

✤ Plugins (usually flash) to open client/server sockets

Wednesday, November 28, 12

Page 19: RealTime Web with PocketIO

What’s Available

✤ Comet

Wednesday, November 28, 12

Page 20: RealTime Web with PocketIO

What’s Available

✤ Web Sockets (modern browsers)

Wednesday, November 28, 12

Page 21: RealTime Web with PocketIO

Meet PocketIOPerl implementation of Socket.IO written by vti

Wednesday, November 28, 12

Page 22: RealTime Web with PocketIO

The Good

✤ Chooses the best available transport layer

✤ Manages active connections and reconnections

✤ Awesome

Wednesday, November 28, 12

Page 23: RealTime Web with PocketIO

PocketIO Components

Server Side Backend(perl)

Client Side Library(JavaScript)

Wednesday, November 28, 12

Page 24: RealTime Web with PocketIO

Coding Time

Wednesday, November 28, 12

Page 25: RealTime Web with PocketIO

PocketIO Architecture

Twiggy Web Server

PocketIO Service

“Normal” Web Service

Wednesday, November 28, 12

Page 26: RealTime Web with PocketIO

What You Need

✤ cpanm PocketIO

✤ Use Twiggy (or fliggy)

✤ Use Plack::Builder

Wednesday, November 28, 12

Page 27: RealTime Web with PocketIO

What You Need

✤ /socket.io/socket.io.js should point to the client-side library

mount '/socket.io/socket.io.js' => Plack::App::File->new( file => "$root/public/javascripts/socket.io.js");

Wednesday, November 28, 12

Page 28: RealTime Web with PocketIO

What You Need

✤ /socket.io should return a new PocketIO object

mount '/socket.io' => PocketIO->new( class => 'PocketHandler', method => 'run', );

Method that returns a subroutine reference to bind socket actions

Wednesday, November 28, 12

Page 29: RealTime Web with PocketIO

PocketIO::Run

✤ Demo 1: Echo Server

Wednesday, November 28, 12

Page 30: RealTime Web with PocketIO

PocketIO Broadcasts

✤ notify all except sender:$sender->broadcast->emit(‘message’, ‘text’);

✤ notify all (including sender)$sender->sockets->emit(‘message’, ‘text’);

✤ send an object$sender->sockets->emit(‘message’, { message => ‘text’});

Wednesday, November 28, 12

Page 31: RealTime Web with PocketIO

PocketIO Broadcasts

✤ Demo2: Shared Echo (wall)

✤ Let’s turn our wall to multi-user wall

Wednesday, November 28, 12

Page 32: RealTime Web with PocketIO

PocketIO Sharing Data

✤ Use an external data store (DB, Redis)

✤ Use Plack

Wednesday, November 28, 12

Page 33: RealTime Web with PocketIO

External Data Store

Shared Data Store

PocketIO Dancer

Wednesday, November 28, 12

Page 34: RealTime Web with PocketIO

Plack

✤ Create a shared variable in Plack::Builder (or a middleware)

✤ Pass it to all apps

✤ Demo

Wednesday, November 28, 12

Page 35: RealTime Web with PocketIO

PocketIO Takeaways

✤ Bring users closer together by allowing smooth collaboration

✤ Improve UX

✤ Multiplayer Zombie Slaying games FTW

Wednesday, November 28, 12

Page 36: RealTime Web with PocketIO

Thank You

✤ Slides are available at:http://www.slideshare.net/YnonPerek

✤ Code is available at:https://github.com/ynonp/pm-nov-12

✤ I’m available at:http://mobileweb.ynonperek.com

Wednesday, November 28, 12