Cowboy rabbit-websockets

45
Erlang + Message Queue + HTML 5 Tech

Transcript of Cowboy rabbit-websockets

Page 1: Cowboy rabbit-websockets

Erlang +

Message Queue+

HTML 5 Tech

Page 2: Cowboy rabbit-websockets

=

Over-engineered Chat Server

Page 3: Cowboy rabbit-websockets

WhatCowboy ?https://github.com/extend/cowboy

Small, fast modular web server written in erlang.

Page 4: Cowboy rabbit-websockets

WhatGen Bunny https://github.com/mochi/gen_bunny

RabbitMQ client library for simple pubsub in erlang.

Page 5: Cowboy rabbit-websockets

WhatWebsocket ?https://www.websocket.org/

Bi-directional web communication mechanism.

Page 6: Cowboy rabbit-websockets

Over Architecturing

You want it.I deliver !

Page 7: Cowboy rabbit-websockets

Server

Moving parts

Cowboy

Gen Bunny

Browser

Page 8: Cowboy rabbit-websockets

Client

Moving parts

Cowboy

Gen Bunny

Browser

Page 9: Cowboy rabbit-websockets

Websockets

TechnicalDetour

Page 10: Cowboy rabbit-websockets

Client

Moving parts

BrowserBrowser

Server

HTTP

Port 80Port 80

Page 11: Cowboy rabbit-websockets

Client

Moving parts

BrowserBrowser

Server

WS

UpgradeUpgradePort 80Port 80

Page 12: Cowboy rabbit-websockets

WHY ?

WORKS WITH EXISTING PROXIES

Page 13: Cowboy rabbit-websockets

Client JS

Data is live chat stream

Page 14: Cowboy rabbit-websockets

JS Connection

wsUrl = "ws://server:8081/websocket";

websocket = new WebSocket(wsUrl);

Page 15: Cowboy rabbit-websockets

Websocket Setupwebsocket = new WebSocket(wsURL);

websocket.onopen = ...

websocket.onmessage =

function(evt){ onMessage(e) };

websocket.onerror = ...

Page 16: Cowboy rabbit-websockets

onMessage Handler

function onMessage(e) {

Msg = '<p>' + txt + '</p>'

$('#output').prepend(Msg);

};

Page 17: Cowboy rabbit-websockets

Smooth

Yeah

Page 18: Cowboy rabbit-websockets

Server SideServer

WS

Page 19: Cowboy rabbit-websockets

Cowboy

What comes to mind ?

Page 20: Cowboy rabbit-websockets

Kid Rock

Page 21: Cowboy rabbit-websockets

Fresh Leather

Page 22: Cowboy rabbit-websockets

Pretty Lil' web server

Page 23: Cowboy rabbit-websockets

Cowboy

Routes, REST, middleware, web sockets and more.

Page 24: Cowboy rabbit-websockets

Cowboy

follows OTP principals.

Page 25: Cowboy rabbit-websockets

Cowboy WS

Required Callbacks init websocket_init websocket_handle websocket_info websocket_terminate

Page 26: Cowboy rabbit-websockets

Cowboy WS

initUpgrades from http → web socket

Page 27: Cowboy rabbit-websockets

Cowboy WS

init({tcp, http}, _Req, _Opts) →{upgrade,protocol,cowboy_websocket}.

Page 28: Cowboy rabbit-websockets

Cowboy WS

websocket_initRun on each connection.

Page 29: Cowboy rabbit-websockets

Cowboy WS

websocket_init(_Name, Req, _Opts) → Pid = consumer:start_link(), {ok, Req, #state{pid=Pid}}.

Page 30: Cowboy rabbit-websockets

Cowboy WS

websocket_handleRecv data from client, optionally return data.

Page 31: Cowboy rabbit-websockets

Cowboy WS

websocket_handle(Data, Req, State) → {text, Msg} = Data, {reply, {text, << "recv: ", Msg/binary >>}, Req,

State};

Page 32: Cowboy rabbit-websockets

Cowboy WS

websocket_infoLive Push data to client

Page 33: Cowboy rabbit-websockets

Cowboy WS

websocket_info(Data, Req, State) → {reply, {text, Data}, Req,State};

Page 34: Cowboy rabbit-websockets

Sending to RabbitMQRabbitMQ

websocket_handle

Page 35: Cowboy rabbit-websockets

Recv from RabbitMQRabbitMQ

websocket_info

gen_bunnyCONSUMER

Page 36: Cowboy rabbit-websockets

Message Queues

gen bunny

Page 37: Cowboy rabbit-websockets

gen_bunny

follows OTP principals.

Page 38: Cowboy rabbit-websockets

callbacks

Required:● handle_message

● init ● handle_call● handle_cast● handle_info● terminate

Page 39: Cowboy rabbit-websockets

callbacks

handle_messageHandle messages from the message subscribed message queue.

Page 40: Cowboy rabbit-websockets

callbacks

handle_message(Msg, State) →NewState = act_on_msg(Msg,State){noreply, NewState};

Page 41: Cowboy rabbit-websockets

MQ perspectiveEx

chan

ge

Exchange“Fanout”

M S

G

M S

G

M S

G

M S

G

M S

G

M S

G

M S

G

M S

G

M S

G

M S

G

M S

G

M S

G

Page 42: Cowboy rabbit-websockets

Live demoWireless Network:Name: rabbitPassword: carrot

VISIT:http://10.1.1.1:8081/

Page 43: Cowboy rabbit-websockets

Benchmarking

Method:

Connect to WebsocketWait for signal.Send 100 messages.Receive all messages

Page 44: Cowboy rabbit-websockets

Benchmarking

Results:(Didn't get this done in time, sorry)

0.5 1 1.5 2 2.5 3 3.5 4 4.50

2

4

6

8

10

12

Column 1

Column 2

Column 3

Page 45: Cowboy rabbit-websockets

Source Codegithub.com/wmeal ing/

bunny-cowboy-websocket