Slide 1

Slide 1 text

Message queues
 for everyone An intro workshop to AMQP For Node.js Developers

Slide 2

Slide 2 text

AMQP

Slide 3

Slide 3 text

Advanced Message
 Queuing Protocol

Slide 4

Slide 4 text

0.9.1

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

Why?

Slide 7

Slide 7 text

Job Queue
 Event Stream
 Buffered RPC

Slide 8

Slide 8 text

Job Queue

Slide 9

Slide 9 text

Producer Consumer

Slide 10

Slide 10 text

Producer Consumer Producer

Slide 11

Slide 11 text

Producer Consumer Producer Consumer

Slide 12

Slide 12 text

Producer Consumer Producer Consumer

Slide 13

Slide 13 text

Exchange In
 
 Queue Out

Slide 14

Slide 14 text

Slow Operations
 Expensive Operations
 Brittle Operations

Slide 15

Slide 15 text

Producer c = create_channel q = c.queue("task") x = c.default_exchange x.publish( "job1", "payload" ) Consumer c = create_channel q = c.queue("task") q.subscribe(worker) worker = fn(*message) { // do stuff }

Slide 16

Slide 16 text

Acknowledging Messages q = c.queue("task") q.subscribe(ack = TRUE, worker) worker = fn(body, headers, info, m) { // do work m.acknowledge() }

Slide 17

Slide 17 text

Publishing Options Mandatory Will error if not queued Confirm Server acknowledges receipt

Slide 18

Slide 18 text

Queue Declare Options Passive Don't create, get reference to existing queue Durable Queue still exists after a broker restart

Slide 19

Slide 19 text

Event Stream

Slide 20

Slide 20 text

Producer Consumer Producer Consumer Consumer Consumer Producer

Slide 21

Slide 21 text

Messages Routing Key

Slide 22

Slide 22 text

Exchanges Fanout: all queues
 Direct: matching key
 Topic: key patterns

Slide 23

Slide 23 text

Exchange |
 Binding
 | Queue

Slide 24

Slide 24 text

Topic Exchange routing.key Exact match routing.*.key routing.#.key Wildcard matching routing.key routing.a.key routing.b.key routing.a.b.key

Slide 25

Slide 25 text

(soft) Real-time updates
 User notifications
 Work distribution

Slide 26

Slide 26 text

Binding a Queue x = c.exchange("activity”) q = c.queue("alert") q.bind(x, "balance.*") q.bind(x, "transfer.out") x.publish("balance.low") x.publish("transfer.in") x.publish("transfer.out")

Slide 27

Slide 27 text

Queue Declare Options Exclusive Only one consumer on this queue at any time Auto Delete Queue is deleted after consumer disconnects

Slide 28

Slide 28 text

Simulator Demo

Slide 29

Slide 29 text

Buffered RPC

Slide 30

Slide 30 text

Producer Consumer

Slide 31

Slide 31 text

Smooth out Spikes
 Transparently scale
 Deferred Response

Slide 32

Slide 32 text

Message Header Reply To
 Correlation ID

Slide 33

Slide 33 text

Reply To reply = c.queue("abcdef") x.publish("request", headers: { replyTo: "abcdef" }}) reply.subscribe(handleResponse)

Slide 34

Slide 34 text

Correlation ID x.publish("request1", headers: { replyTo: "abcdef", correlationId: "request1" }) x.publish("request2", headers: { replyTo: "abcdef", correlationId: "request2" })

Slide 35

Slide 35 text

Admin Interface Demo

Slide 36

Slide 36 text

Why not just use … ?

Slide 37

Slide 37 text

Redis pub/sub
 (Resque etc)

Slide 38

Slide 38 text

Beanstalkd

Slide 39

Slide 39 text

JMS
 Stomp

Slide 40

Slide 40 text

MQTT

Slide 41

Slide 41 text

ØMQ

Slide 42

Slide 42 text

Node.js Quickstart

Slide 43

Slide 43 text

npm install amqp

Slide 44

Slide 44 text

var amqp = require('amqp')
 
 var conn = amqp.createConnection(
 { url: 'amqp://un:pw@host:5672/vhost' },
 { reconnect: false }
 )
 
 conn.on('ready', function() {
 // Do stuff
 })

Slide 45

Slide 45 text

var opts = { noDeclare: true }
 conn.queue(name, opts, function(q) {
 q.subscribe(
 { ack: true, prefetch: 1 },
 onMessage
 )
 })
 function onMessage(body, meta, info, msg) {
 // do some stuff
 msg.acknowledge()
 }

Slide 46

Slide 46 text

var opts = {
 type: 'topic',
 noDeclare: true
 }
 conn.exchange(name, opts, function(x) {
 x.publish('key', 'body', {
 contentType: 'text/json'
 })
 })

Slide 47

Slide 47 text

Questions?

Slide 48

Slide 48 text

Lets go! http://amqp-nodejs.herokuapp.com https://addons.heroku.com/marketplace/rabbitmq-bigwig

Slide 49

Slide 49 text

@glenathan