An intro to AMQP for Node.js developers
Message queues for everyoneAn intro workshop to AMQPFor Node.js Developers
View Slide
AMQP
Advanced Message Queuing Protocol
0.9.1
Why?
Job Queue Event Stream Buffered RPC
Job Queue
Producer Consumer
ProducerConsumerProducer
Producer ConsumerProducer Consumer
Exchange In Queue Out
Slow Operations Expensive Operations Brittle Operations
Producerc = create_channelq = c.queue("task")x = c.default_exchangex.publish("job1","payload")Consumerc = create_channelq = c.queue("task")q.subscribe(worker)worker = fn(*message){// do stuff}
Acknowledging Messagesq = c.queue("task")q.subscribe(ack = TRUE, worker)worker = fn(body, headers, info, m) {// do workm.acknowledge()}
Publishing OptionsMandatoryWill error if not queuedConfirmServer acknowledges receipt
Queue Declare OptionsPassiveDon't create, get reference toexisting queueDurableQueue still exists after a brokerrestart
Event Stream
ProducerConsumerProducerConsumerConsumerConsumerProducer
MessagesRouting Key
ExchangesFanout: all queues Direct: matching key Topic: key patterns
Exchange| Binding |Queue
Topic Exchangerouting.keyExact matchrouting.*.keyrouting.#.keyWildcardmatchingrouting.keyrouting.a.keyrouting.b.keyrouting.a.b.key
(soft) Real-time updates User notifications Work distribution
Binding a Queuex = 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")
Queue Declare OptionsExclusiveOnly one consumer on this queueat any timeAuto DeleteQueue is deleted after consumerdisconnects
Simulator Demo
Buffered RPC
ProducerConsumer
Smooth out Spikes Transparently scale Deferred Response
Message HeaderReply To Correlation ID
Reply Toreply = c.queue("abcdef")x.publish("request", headers: {replyTo: "abcdef"}})reply.subscribe(handleResponse)
Correlation IDx.publish("request1", headers: {replyTo: "abcdef",correlationId: "request1"})x.publish("request2", headers: {replyTo: "abcdef",correlationId: "request2"})
Admin Interface Demo
Why not justuse … ?
Redis pub/sub (Resque etc)
Beanstalkd
JMS Stomp
MQTT
ØMQ
Node.js Quickstart
npm install amqp
var amqp = require('amqp') var conn = amqp.createConnection( { url: 'amqp://un:pw@host:5672/vhost' }, { reconnect: false } ) conn.on('ready', function() { // Do stuff })
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() }
var opts = { type: 'topic', noDeclare: true } conn.exchange(name, opts, function(x) { x.publish('key', 'body', { contentType: 'text/json' }) })
Questions?
Lets go!http://amqp-nodejs.herokuapp.comhttps://addons.heroku.com/marketplace/rabbitmq-bigwig
@glenathan