queues queues queues — how rabbitmq enables reactive architectures

236
Martin Tajur CTO, Co-Founder February 16, 2016 DevClub XLIII meetup, Tallinn, Estonia Hello.

Upload: martin-tajur

Post on 07-Jan-2017

459 views

Category:

Software


3 download

TRANSCRIPT

Page 1: Queues queues queues — How RabbitMQ enables reactive architectures

Martin TajurCTO, Co-Founder

February 16, 2016DevClub XLIII meetup, Tallinn, Estonia

Hello.

Page 2: Queues queues queues — How RabbitMQ enables reactive architectures

● Web-based CRM for small teams with big ambitions.

Page 3: Queues queues queues — How RabbitMQ enables reactive architectures

● Web-based CRM for small teams with big ambitions.● Founded in 2010.

Page 4: Queues queues queues — How RabbitMQ enables reactive architectures

● Web-based CRM for small teams with big ambitions.● Founded in 2010.● Used by over 30,000 businesses worldwide.

Page 5: Queues queues queues — How RabbitMQ enables reactive architectures

● Web-based CRM for small teams with big ambitions.● Founded in 2010.● Used by over 30,000 businesses worldwide.● 140+ employees, venture funded (BVP, Series A in 2015)

Page 6: Queues queues queues — How RabbitMQ enables reactive architectures

● Web-based CRM for small teams with big ambitions.● Founded in 2010.● Used by over 30,000 businesses worldwide.● 140+ employees, venture funded (BVP, Series A in 2015)● Engineering, Product, UX, Marketing in Tallinn and Tartu.

Marketing, BizDev in New York, NY.

Page 7: Queues queues queues — How RabbitMQ enables reactive architectures

● Web-based CRM for small teams with big ambitions.● Founded in 2010.● Used by over 30,000 businesses worldwide.● 140+ employees, venture funded (BVP, Series A in 2015)● Engineering, Product, UX, Marketing in Tallinn and Tartu.

Marketing, BizDev in New York, NY.● Very end user focused, helping the actual sales person do

their job.

Page 8: Queues queues queues — How RabbitMQ enables reactive architectures
Page 9: Queues queues queues — How RabbitMQ enables reactive architectures

● 20,000+ simultaneous online users

Page 10: Queues queues queues — How RabbitMQ enables reactive architectures

● 20,000+ simultaneous online users

● 800+ API req/sec

Page 11: Queues queues queues — How RabbitMQ enables reactive architectures

● 20,000+ simultaneous online users

● 800+ API req/sec

● 400,000+ incoming emails per day

Page 12: Queues queues queues — How RabbitMQ enables reactive architectures

● 20,000+ simultaneous online users

● 800+ API req/sec

● 400,000+ incoming emails per day

● Started with Node.js based microservices, reactive

architecture in 2012

Page 13: Queues queues queues — How RabbitMQ enables reactive architectures

● 20,000+ simultaneous online users

● 800+ API req/sec

● 400,000+ incoming emails per day

● Started with Node.js based microservices, reactive

architecture in 2012

● In production with first Docker based services

Page 14: Queues queues queues — How RabbitMQ enables reactive architectures

● 20,000+ simultaneous online users

● 800+ API req/sec

● 400,000+ incoming emails per day

● Started with Node.js based microservices, reactive

architecture in 2012

● In production with first Docker based services

● In total, 500+ VMs/hosts/instances

Page 15: Queues queues queues — How RabbitMQ enables reactive architectures
Page 16: Queues queues queues — How RabbitMQ enables reactive architectures
Page 17: Queues queues queues — How RabbitMQ enables reactive architectures
Page 18: Queues queues queues — How RabbitMQ enables reactive architectures

Queues, queues, queuesHow RabbitMQ enables reactive architectures

Martin TajurCTO, Co-Founder

February 16, 2016DevClub XLIII meetup, Tallinn, Estonia

Page 19: Queues queues queues — How RabbitMQ enables reactive architectures

➔ Co-Founder and CTO of Pipedrive.

➔ Started career in 2001 as a designer, later a full stack dev.

➔ Part of ex-Skype mafia

About me

Page 20: Queues queues queues — How RabbitMQ enables reactive architectures

Reactive architectures

Page 21: Queues queues queues — How RabbitMQ enables reactive architectures

The Reactive Manifesto

Page 22: Queues queues queues — How RabbitMQ enables reactive architectures
Page 23: Queues queues queues — How RabbitMQ enables reactive architectures

Manifestos are good when

➔ they are used as building blocks

➔ they add, rather than compete or subtract

➔ they tap into the growing wisdom, and extend it

Page 24: Queues queues queues — How RabbitMQ enables reactive architectures
Page 25: Queues queues queues — How RabbitMQ enables reactive architectures

Ok, so,the reactive manifesto...

Page 26: Queues queues queues — How RabbitMQ enables reactive architectures

An initiative to define atech agnostic shared vocabulary ofarchitectural patterns for reactive systems.

Page 27: Queues queues queues — How RabbitMQ enables reactive architectures

It states that...

Page 28: Queues queues queues — How RabbitMQ enables reactive architectures

Systems should be reactive to

Page 29: Queues queues queues — How RabbitMQ enables reactive architectures

Systems should be reactive to

Events

Page 30: Queues queues queues — How RabbitMQ enables reactive architectures

Systems should be reactive to

Events Load

Page 31: Queues queues queues — How RabbitMQ enables reactive architectures

Systems should be reactive to

Events Load

Failure

Page 32: Queues queues queues — How RabbitMQ enables reactive architectures

Systems should be reactive to

Events Load

Failure Users

Page 33: Queues queues queues — How RabbitMQ enables reactive architectures

Systems should be reactive to tolerate

Events Load

Failure Users

Page 34: Queues queues queues — How RabbitMQ enables reactive architectures

ResponsiveReact to users in

timely manner

http://www.slideshare.net/RezaSamee/the-reactive-manifesto-49897385

Goal

Page 35: Queues queues queues — How RabbitMQ enables reactive architectures

ResponsiveReact to users in

timely manner

ResilientReact to failures

ElasticReact to load

http://www.slideshare.net/RezaSamee/the-reactive-manifesto-49897385

Goal

Principles

Page 36: Queues queues queues — How RabbitMQ enables reactive architectures

ResponsiveReact to users in

timely manner

ResilientReact to failures

ElasticReact to load

Message-drivenComponent-to-component interaction

http://www.slideshare.net/RezaSamee/the-reactive-manifesto-49897385

Goal

Principles

Method

Page 37: Queues queues queues — How RabbitMQ enables reactive architectures

Systems built as Reactive Systems are more flexible, loosely-coupled and scalable.

Page 38: Queues queues queues — How RabbitMQ enables reactive architectures

This makes themeasier to develop and amenable to change.

Page 39: Queues queues queues — How RabbitMQ enables reactive architectures

They are significantly more tolerant of failure and when failure does occur they meet it with elegance rather than disaster.

Page 40: Queues queues queues — How RabbitMQ enables reactive architectures

Reactive Systems arehighly responsive, giving users effective interactive feedback.

Page 41: Queues queues queues — How RabbitMQ enables reactive architectures

How queues fit in to the picture?

Page 42: Queues queues queues — How RabbitMQ enables reactive architectures

10 benefits of using message

queues

Decoupling

Redundancy

Load Balancing, Scalability

Elasticity & Spikability

Resiliency

Delivery Guarantees

Ordering Guarantees

Buffering

Data Flow visibility

Asynchronous communication

http://www.iron.io/top-10-uses-for-message-queue/

Page 43: Queues queues queues — How RabbitMQ enables reactive architectures

10 benefits of using message

queues

Decoupling

Redundancy

Load Balancing, Scalability

Elasticity & Spikability

Resiliency

Delivery Guarantees

Ordering Guarantees

Buffering

Data Flow visibility

Asynchronous communication

Page 44: Queues queues queues — How RabbitMQ enables reactive architectures

Decoupling

➔ Hard to predict future needs at the start of a project.

➔ Message queues create an implicit, data-based interface that different services can implement.

➔ Allows you to extend and modify processes independently, ensuring they adhere to the same interfaces.

➔ Lets you swap, mix and add queue consuming services.

Page 45: Queues queues queues — How RabbitMQ enables reactive architectures

10 benefits of using message

queues

Decoupling

Redundancy

Load Balancing, Scalability

Elasticity & Spikability

Resiliency

Delivery Guarantees

Ordering Guarantees

Buffering

Data Flow visibility

Asynchronous communication

Page 46: Queues queues queues — How RabbitMQ enables reactive architectures

10 benefits of using message

queues

Decoupling

Redundancy

Load Balancing, Scalability

Elasticity & Spikability

Resiliency

Delivery Guarantees

Ordering Guarantees

Buffering

Data Flow visibility

Asynchronous communication

Page 47: Queues queues queues — How RabbitMQ enables reactive architectures

Redundancy

➔ Sometimes, services die when processing data.

➔ Unless that data is persisted, it’s lost forever.

➔ Queues mitigate this by persisting data until it has been fully processed.

➔ No job gets lost.

Page 48: Queues queues queues — How RabbitMQ enables reactive architectures

10 benefits of using message

queues

Decoupling

Redundancy

Load Balancing, Scalability

Elasticity & Spikability

Resiliency

Delivery Guarantees

Ordering Guarantees

Buffering

Data Flow visibility

Asynchronous communication

Page 49: Queues queues queues — How RabbitMQ enables reactive architectures

10 benefits of using message

queues

Decoupling

Redundancy

Load Balancing, Scalability

Elasticity & Spikability

Resiliency

Delivery Guarantees

Ordering Guarantees

Buffering

Data Flow visibility

Asynchronous communication

Page 50: Queues queues queues — How RabbitMQ enables reactive architectures

Load Balancing, Scalability

➔ It’s easy to scale up the rate with which messages are added to the queue or processed – by adding more instances.

➔ Easy to create load balancing by attaching multiple workers to a single queue.

➔ No code changes, no configurations need to be tweaked.

➔ Scaling is as simple as adding more power.

Page 51: Queues queues queues — How RabbitMQ enables reactive architectures

10 benefits of using message

queues

Decoupling

Redundancy

Load Balancing, Scalability

Elasticity & Spikability

Resiliency

Delivery Guarantees

Ordering Guarantees

Buffering

Data Flow visibility

Asynchronous communication

Page 52: Queues queues queues — How RabbitMQ enables reactive architectures

10 benefits of using message

queues

Decoupling

Redundancy

Load Balancing, Scalability

Elasticity & Spikability

Resiliency

Delivery Guarantees

Ordering Guarantees

Buffering

Data Flow visibility

Asynchronous communication

Page 53: Queues queues queues — How RabbitMQ enables reactive architectures

Elasticity & Spikability

➔ When your application hits the front page of Hacker News, you’re going to see unusual levels of traffic.

➔ Your application needs to be able to keep functioning.

➔ But the traffic is anomaly, not the standard — it’s wasteful to have enough resources on standby to handle these spikes.

➔ Message queues will allow components to struggle through the increased load, instead of getting overloaded with requests and failing completely.

➔ Queue lengths and consumer utilization = basis for auto-scaling.

Page 54: Queues queues queues — How RabbitMQ enables reactive architectures

10 benefits of using message

queues

Decoupling

Redundancy

Load Balancing, Scalability

Elasticity & Spikability

Resiliency

Delivery Guarantees

Ordering Guarantees

Buffering

Data Flow visibility

Asynchronous communication

Page 55: Queues queues queues — How RabbitMQ enables reactive architectures

10 benefits of using message

queues

Decoupling

Redundancy

Load Balancing, Scalability

Elasticity & Spikability

Resiliency

Delivery Guarantees

Ordering Guarantees

Buffering

Data Flow visibility

Asynchronous communication

Page 56: Queues queues queues — How RabbitMQ enables reactive architectures

Resiliency

➔ When part of your architecture fails, it doesn’t need to take the entire system down :-)

➔ Message queues decouple services, so if a service that is processing messages from the queue fails, messages can still be added to the queue to be processed when the system recovers.

➔ This ability to accept requests that will be retried or processed at a later date is often the difference between an inconvenienced customer and a frustrated customer.

Page 57: Queues queues queues — How RabbitMQ enables reactive architectures

10 benefits of using message

queues

Decoupling

Redundancy

Load Balancing, Scalability

Elasticity & Spikability

Resiliency

Delivery Guarantees

Ordering Guarantees

Buffering

Data Flow visibility

Asynchronous communication

Page 58: Queues queues queues — How RabbitMQ enables reactive architectures

10 benefits of using message

queues

Decoupling

Redundancy

Load Balancing, Scalability

Elasticity & Spikability

Resiliency

Delivery Guarantees

Ordering Guarantees

Buffering

Data Flow visibility

Asynchronous communication

Page 59: Queues queues queues — How RabbitMQ enables reactive architectures

Delivery guarantees

➔ The redundancy provided by message queues guarantees that a message will eventually be processed.

➔ No matter how many processes are pulling data from the queue, each message will be processed at least once.

➔ This is often made possible using a way to “reserve” messages being processed, temporarily removing them from the queue.

➔ Unless the client specifically states that it’s finished with that message, the message will be placed back to the top of the queue.

Page 60: Queues queues queues — How RabbitMQ enables reactive architectures

10 benefits of using message

queues

Decoupling

Redundancy

Load Balancing, Scalability

Elasticity & Spikability

Resiliency

Delivery Guarantees

Ordering Guarantees

Buffering

Data Flow visibility

Asynchronous communication

Page 61: Queues queues queues — How RabbitMQ enables reactive architectures

10 benefits of using message

queues

Decoupling

Redundancy

Load Balancing, Scalability

Elasticity & Spikability

Resiliency

Delivery Guarantees

Ordering Guarantees

Buffering

Data Flow visibility

Asynchronous communication

Page 62: Queues queues queues — How RabbitMQ enables reactive architectures

Ordering Guarantees

➔ In a lot of situations, the order with which data is processed is important.

➔ Message queues are inherently ordered, and capable of providing guarantees that data will be processed in a specific order.

➔ Most message queues use FIFO (first in, first out), so the order in which messages are placed on a queue is the order in which they’ll be retrieved from it.

➔ (Beware when using multiple consumers)

Page 63: Queues queues queues — How RabbitMQ enables reactive architectures

10 benefits of using message

queues

Decoupling

Redundancy

Load Balancing, Scalability

Elasticity & Spikability

Resiliency

Delivery Guarantees

Ordering Guarantees

Buffering

Data Flow visibility

Asynchronous communication

Page 64: Queues queues queues — How RabbitMQ enables reactive architectures

10 benefits of using message

queues

Decoupling

Redundancy

Load Balancing, Scalability

Elasticity & Spikability

Resiliency

Delivery Guarantees

Ordering Guarantees

Buffering

Data Flow visibility

Asynchronous communication

Page 65: Queues queues queues — How RabbitMQ enables reactive architectures

Buffering

➔ In any non-trivial system, there are going to be components that require different processing times.

➔ For example, it takes less time to upload an image than it does to apply a filter to it.

➔ You can also collect a certain number of items together and process them as a single batch.

Page 66: Queues queues queues — How RabbitMQ enables reactive architectures

10 benefits of using message

queues

Decoupling

Redundancy

Load Balancing, Scalability

Elasticity & Spikability

Resiliency

Delivery Guarantees

Ordering Guarantees

Buffering

Data Flow visibility

Asynchronous communication

Page 67: Queues queues queues — How RabbitMQ enables reactive architectures

10 benefits of using message

queues

Decoupling

Redundancy

Load Balancing, Scalability

Elasticity & Spikability

Resiliency

Delivery Guarantees

Ordering Guarantees

Buffering

Data Flow visibility

Asynchronous communication

Page 68: Queues queues queues — How RabbitMQ enables reactive architectures

Data Flow Visibility

➔ In a distributed system, getting an overall sense of where and how data flows can be a daunting task.

➔ Message queues, and routing rules, help identify and understand data flow paths.

➔ Through the rate with which they are processed, one can easily identify under-performing processes or areas where the data flow is not optimal.

Page 69: Queues queues queues — How RabbitMQ enables reactive architectures
Page 70: Queues queues queues — How RabbitMQ enables reactive architectures

10 benefits of using message

queues

Decoupling

Redundancy

Load Balancing, Scalability

Elasticity & Spikability

Resiliency

Delivery Guarantees

Ordering Guarantees

Buffering

Data Flow visibility

Asynchronous communication

Page 71: Queues queues queues — How RabbitMQ enables reactive architectures

10 benefits of using message

queues

Decoupling

Redundancy

Load Balancing, Scalability

Elasticity & Spikability

Resiliency

Delivery Guarantees

Ordering Guarantees

Buffering

Data Flow visibility

Asynchronous communication

Page 72: Queues queues queues — How RabbitMQ enables reactive architectures

Async Communication

➔ A lot of times, you don’t want to or need to process a message immediately.

➔ Message queues enable asynchronous processing, which allows you to put a message on the queue without processing it immediately.

➔ Queue up as many messages as you like, then process them at your leisure.

➔ Opens possibilities for retry-later setups.

Page 73: Queues queues queues — How RabbitMQ enables reactive architectures

10 benefits of using message

queues

Decoupling

Redundancy

Load Balancing, Scalability

Elasticity & Spikability

Resiliency

Delivery Guarantees

Ordering Guarantees

Buffering

Data Flow visibility

Asynchronous communication

Page 74: Queues queues queues — How RabbitMQ enables reactive architectures

10 benefits of using message

queues

Decoupling

Redundancy

Load Balancing, Scalability

Elasticity & Spikability

Resiliency

Delivery Guarantees

Ordering Guarantees

Buffering

Data Flow visibility

Asynchronous communication

http://www.iron.io/top-10-uses-for-message-queue/

Page 75: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ

Page 76: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ

➔ An AMQP messaging broker

➔ Written in Erlang

➔ Launched in 2007

➔ Originally written by Rabbit Technologies Ltd. in London, UK

➔ Got acquired in 2010 by a division of VMWare

➔ Spin-off in 2013 to Pivotal Software, Inc

➔ Core participant of the AMQP working group

Page 77: Queues queues queues — How RabbitMQ enables reactive architectures

AMQP

➔ Advanced Message Queue Protocol

➔ An open standard, independent from RabbitMQ

➔ Provider agnostic, in theory.A client should be able to swap RabbitMQ with different AMQP server

➔ Client libraries available for all major programming languages

➔ Most recent specification version is 1.0. *

* RabbitMQ mostly AMQP version 0.9.1 as of Feb 2016.

Page 78: Queues queues queues — How RabbitMQ enables reactive architectures
Page 79: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ server

Basic concept

binding

Publisher

Page 80: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ server

Basic concept

Publisher Exchange

Page 81: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ server

Basic concept

Publisher

Queue

Queue

Exchange

Page 82: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ server

Basic concept

Publisher

Queue

Queue

binding

binding

Exchange

Page 83: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ server

Basic concept

Publisher

ConsumerQueue

Queue

binding

binding

Exchange

Page 84: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ server

Basic concept

Consumer

Consumer

Consumer

Publisher

Queue

Queue

binding

binding

Exchange

Page 85: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ server

Basic concept

statisticsqueue

webhookqueue

#

#.company_15

dealsexchange

Deals service

statistics service

webhook service

webhook service

Page 86: Queues queues queues — How RabbitMQ enables reactive architectures

Queue

Queue

binding

binding

Exchange

Consumer

Consumer

Consumer

RabbitMQ server

Basic concept

Publisher

Publishing

Page 87: Queues queues queues — How RabbitMQ enables reactive architectures

Publishing

➔ Your apps publish messages. Each message has

◆ routing key (e.g. subject)

◆ delivery mode (persistent or not persistent)

◆ headers (e.g. { "content-type": "application/json" })

◆ payload (e.g. { "some": "json" })

◆ properties (e.g. correlation-id)

Page 88: Queues queues queues — How RabbitMQ enables reactive architectures
Page 89: Queues queues queues — How RabbitMQ enables reactive architectures

Queue

Queue

binding

binding

Exchange

RabbitMQ server

Consumer

Consumer

Consumer

Basic concept

Publisher

Publishing

Page 90: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ server

Exchange

Basic concept

Consumer

Consumer

Consumer

Publisher

Queue

Queue

binding

binding

Exchange

Page 91: Queues queues queues — How RabbitMQ enables reactive architectures

Exchanges

➔ Exchanges are AMQP entities where messages are sent to.

➔ Exchanges on their own are useless,unless bound to something.

https://www.rabbitmq.com/tutorials/amqp-concepts.html

Page 92: Queues queues queues — How RabbitMQ enables reactive architectures

Four types of exchanges

➔ Direct, Fanout, Topic, Headers

➔ Type defines how you can bind from it

➔ Most useful is Topic (allows regexp-like bindings)

➔ Read more from RabbitMQ docs

Page 93: Queues queues queues — How RabbitMQ enables reactive architectures

Queue

Queue

binding

binding

Exchange

RabbitMQ server

Exchange

Basic concept

Consumer

Consumer

Consumer

Publisher

Page 94: Queues queues queues — How RabbitMQ enables reactive architectures

Queue

Queue

binding

binding

Exchange

RabbitMQ server

Basic concept

Bindings

Consumer

Consumer

Consumer

Publisher

Page 95: Queues queues queues — How RabbitMQ enables reactive architectures

Bindings

➔ Rules with which messages are routedfrom exchanges to queues

➔ Each queue and exchange can have multiple bindings

➔ Examples: [characteristic].[color].[kind]◆ *.orange.*◆ *.*.rabbit◆ lazy.#

Page 96: Queues queues queues — How RabbitMQ enables reactive architectures

Bindings

Q1 is interested in all the orange animals.

Q2 wants to hear everything about rabbits, and everything about lazy animals.

Page 97: Queues queues queues — How RabbitMQ enables reactive architectures

Queue

Queue

binding

binding

Exchange

RabbitMQ server

Basic concept

Bindings

Consumer

Consumer

Consumer

Publisher

Page 98: Queues queues queues — How RabbitMQ enables reactive architectures

Queue

Queue

binding

binding

Exchange

RabbitMQ server

Basic concept

Consumer

Consumer

Consumer

Publisher

Queues

Page 99: Queues queues queues — How RabbitMQ enables reactive architectures

Queues

➔ Ordered lists of messages to be consumed

➔ FIFO

➔ Can be either durable or transient

➔ Can have arguments (behavioral properties)TTL of messages in itauto-expirymaximum lengthdead letter handling

Page 100: Queues queues queues — How RabbitMQ enables reactive architectures

Queue

Queue

binding

binding

Exchange

RabbitMQ server

Basic concept

Consumer

Consumer

Consumer

Publisher

Queues

Page 101: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ server

Basic concept

Queue

Queue

binding

binding

Exchange

Consuming

Consumer

Consumer

Consumer

Publisher

Page 102: Queues queues queues — How RabbitMQ enables reactive architectures

Consuming

➔ Act of receiving and acting upon messages from a queue

Page 103: Queues queues queues — How RabbitMQ enables reactive architectures

Consuming

➔ Act of receiving and acting upon messages from a queue

➔ One at a time, or multiple-in-flight with acking

Page 104: Queues queues queues — How RabbitMQ enables reactive architectures

Consuming

➔ Act of receiving and acting upon messages from a queue

➔ One at a time, or multiple-in-flight with acking

➔ Delivery and execution guarantees

Page 105: Queues queues queues — How RabbitMQ enables reactive architectures

Consuming

➔ Act of receiving and acting upon messages from a queue

➔ One at a time, or multiple-in-flight with acking

➔ Delivery and execution guarantees

➔ One queue can have multiple consumers (enables load balancing — but then exact order is not guaranteed)

Page 106: Queues queues queues — How RabbitMQ enables reactive architectures

Consuming

➔ Act of receiving and acting upon messages from a queue

➔ One at a time, or multiple-in-flight with acking

➔ Delivery and execution guarantees

➔ One queue can have multiple consumers (enables load balancing — but then exact order is not guaranteed)

➔ A consumer may ask for exclusivity

Page 107: Queues queues queues — How RabbitMQ enables reactive architectures

Consumption sequence diagram

RabbitMQ Consumer

RabbitMQ Consumer

[message]

Page 108: Queues queues queues — How RabbitMQ enables reactive architectures

Consumption sequence diagram

RabbitMQ Consumer

RabbitMQ Consumer

[message]mark

message ‘unacked’

Page 109: Queues queues queues — How RabbitMQ enables reactive architectures

Consumption sequence diagram

RabbitMQ Consumer

RabbitMQ Consumer

[message]mark

message ‘unacked’ attempt to process

the message

Page 110: Queues queues queues — How RabbitMQ enables reactive architectures

Consumption sequence diagram

RabbitMQ Consumer

RabbitMQ Consumer

[message]mark

message ‘unacked’ attempt to process

the messageack

Page 111: Queues queues queues — How RabbitMQ enables reactive architectures

Consumption sequence diagram

RabbitMQ Consumer

RabbitMQ Consumer

[message]mark

message ‘unacked’ attempt to process

the messageack

mark message delivered

Page 112: Queues queues queues — How RabbitMQ enables reactive architectures

Consumption sequence diagram with a failure

RabbitMQ Consumer

RabbitMQ Consumer

[message]

Page 113: Queues queues queues — How RabbitMQ enables reactive architectures

Consumption sequence diagram with a failure

RabbitMQ Consumer

RabbitMQ Consumer

[message]mark

message ‘unacked’

Page 114: Queues queues queues — How RabbitMQ enables reactive architectures

Consumption sequence diagram with a failure

RabbitMQ Consumer

RabbitMQ Consumer

[message]mark

message ‘unacked’

attempt to process the message

Page 115: Queues queues queues — How RabbitMQ enables reactive architectures

Consumption sequence diagram with a failure

RabbitMQ Consumer

RabbitMQ Consumer

[message]mark

message ‘unacked’

attempt to process the message

dies!

Page 116: Queues queues queues — How RabbitMQ enables reactive architectures

Consumption sequence diagram with a failure

RabbitMQ Consumer

RabbitMQ Consumer

[message]mark

message ‘unacked’

attempt to process the message

(connection reset) dies!

Page 117: Queues queues queues — How RabbitMQ enables reactive architectures

Consumption sequence diagram with a failure

RabbitMQ Consumer

RabbitMQ Consumer

[message]mark

message ‘unacked’

attempt to process the message

(connection reset) dies!

put message back to ‘ready’

Page 118: Queues queues queues — How RabbitMQ enables reactive architectures

Consumption sequence diagram with a failure

RabbitMQ Consumer

RabbitMQ Consumer

[message]mark

message ‘unacked’

attempt to process the message

(connection reset) dies!

put message back to ‘ready’

Consumer

Consumer

Page 119: Queues queues queues — How RabbitMQ enables reactive architectures

Consumption sequence diagram with a failure

RabbitMQ Consumer

RabbitMQ Consumer

[message]mark

message ‘unacked’

attempt to process the message

(connection reset) dies!

put message back to ‘ready’

Consumer

Consumer

[message]mark message ‘unacked’

Page 120: Queues queues queues — How RabbitMQ enables reactive architectures

Consumer characteristics (Node.js)

➔ Persistent TCP connection to AMQP server

➔ RabbitMQ pushes messages to consumer (no polling)

➔ Connection is multiplexed (using channels)

➔ Event listener/callback function is executed per each message, with ack() callback provided to be called when a message can be considered consumed.

Page 121: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ server

Basic concept

Publisher

Queue

Queue

binding

binding

Consumer

Consumer

Consumer

Exchange

Page 122: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ server

Basic concept

Deals service

statisticsqueue

webhookqueue

#

#.company_15

statistics service

webhook service

dealsexchange

webhook service

Page 123: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ server

Basic concept

Deals service

dealsexchange

Photos service

statisticsqueue

webhookqueue

statistics service

webhook service

webhook service

photosexchange

Page 124: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ server

Basic concept

Deals service

statisticsqueue

webhookqueue

statistics service

webhook service

dealsexchange

webhook service

Photos service

photosexchange

analyzerqueue

analyzer service

Page 125: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ server

Basic concept

Deals service

statisticsqueue

webhookqueue

statistics service

webhook service

dealsexchange

webhook service

Photos service

photosexchange

analyzerqueue

analyzer service

resizingqueue photo resizer

service

Page 126: Queues queues queues — How RabbitMQ enables reactive architectures

So it’s like…a series of tubes.

Page 127: Queues queues queues — How RabbitMQ enables reactive architectures
Page 128: Queues queues queues — How RabbitMQ enables reactive architectures

Some like to call it“a post box, a post office and a postman, all in one”...

Page 129: Queues queues queues — How RabbitMQ enables reactive architectures

“When you send mail to the post box you're pretty sure that Mr. Postman will eventually deliver the mail to your recipient. Using this metaphor RabbitMQ is a post box, a post office and a postman.”From the RabbitMQ official tutorial.

Page 130: Queues queues queues — How RabbitMQ enables reactive architectures

However,in a microservices environment, this post metaphor can be dangerous.

Page 131: Queues queues queues — How RabbitMQ enables reactive architectures

The post metaphor can lure you into publishing messages with a specific consumer in mind,

thus increasing tight coupling which makes it harder to add other kinds of consumers in the future without having to change multiple services.

Page 132: Queues queues queues — How RabbitMQ enables reactive architectures

Example:Orchestration vs choreography

Page 133: Queues queues queues — How RabbitMQ enables reactive architectures

User signs up

Example use case shown by Sam Newman in “Principles of microservices” presentation

Page 134: Queues queues queues — How RabbitMQ enables reactive architectures

User signs up

Create user account

Example use case shown by Sam Newman in “Principles of microservices” presentation

Page 135: Queues queues queues — How RabbitMQ enables reactive architectures

User signs up

Create user account

Sign up to newsletter at MailChimp

Example use case shown by Sam Newman in “Principles of microservices” presentation

Page 136: Queues queues queues — How RabbitMQ enables reactive architectures

User signs up

Create user account

Sign up to newsletter at MailChimp

Send welcome email

Example use case shown by Sam Newman in “Principles of microservices” presentation

Page 137: Queues queues queues — How RabbitMQ enables reactive architectures

User signs up

Create user account

Sign up to newsletter at MailChimp

Send welcome email Send welcome gift

Example use case shown by Sam Newman in “Principles of microservices” presentation

Page 138: Queues queues queues — How RabbitMQ enables reactive architectures

User signs up

Create user account

Sign up to newsletter at MailChimp

Send welcome email Send welcome gift

Example use case shown by Sam Newman in “Principles of microservices” presentation

Done!

Page 139: Queues queues queues — How RabbitMQ enables reactive architectures

Orchestration

Page 140: Queues queues queues — How RabbitMQ enables reactive architectures

Example use case shown by Sam Newman in “Principles of microservices” presentation

Sign up service

Orchestration

Page 141: Queues queues queues — How RabbitMQ enables reactive architectures

Example use case shown by Sam Newman in “Principles of microservices” presentation

Orchestration

Sign up service

Newsletter service

subscribe

Page 142: Queues queues queues — How RabbitMQ enables reactive architectures

Example use case shown by Sam Newman in “Principles of microservices” presentation

Orchestration

Sign up service

Newsletter service

Email sendersubscribe

send email

Page 143: Queues queues queues — How RabbitMQ enables reactive architectures

Example use case shown by Sam Newman in “Principles of microservices” presentation

Orchestration

Sign up service

Newsletter service

Email sender

Delivery service

subscribe

send email

send package

Page 144: Queues queues queues — How RabbitMQ enables reactive architectures

➔ With orchestration, messages (commands, really) sent from service A to others end up being explicit and with a single recipient in mind.

Problem with orchestration — tight coupling

Page 145: Queues queues queues — How RabbitMQ enables reactive architectures

➔ With orchestration, messages (commands, really) sent from service A to others end up being explicit and with a single recipient in mind.

➔ Makes it hard to plug in new services along the way, and thus shape the system organically.

Problem with orchestration — tight coupling

Page 146: Queues queues queues — How RabbitMQ enables reactive architectures

➔ With orchestration, messages (commands, really) sent from service A to others end up being explicit and with a single recipient in mind.

➔ Makes it hard to plug in new services along the way, and thus shape the system organically.

➔ Expectations of replies to completed commands — seeing a “send this newsletter out” command in service A may seem like it is a synchronous action, whereas with a message queue it is not.

Problem with orchestration — tight coupling

Page 147: Queues queues queues — How RabbitMQ enables reactive architectures

Choreography

https://www.flickr.com/photos/stevenpisano/16313427202

Page 148: Queues queues queues — How RabbitMQ enables reactive architectures

Choreography

Sign up service

Example use case shown by Sam Newman in “Principles of microservices” presentation

Page 149: Queues queues queues — How RabbitMQ enables reactive architectures

Example use case shown by Sam Newman in “Principles of microservices” presentation

Choreography

Sign up service

user signed up

Page 150: Queues queues queues — How RabbitMQ enables reactive architectures

Example use case shown by Sam Newman in “Principles of microservices” presentation

Choreography

Sign up service

Newsletter service

user signed up

Page 151: Queues queues queues — How RabbitMQ enables reactive architectures

Example use case shown by Sam Newman in “Principles of microservices” presentation

Choreography

Sign up service

Email sender

Newsletter service

user signed up

Page 152: Queues queues queues — How RabbitMQ enables reactive architectures

Example use case shown by Sam Newman in “Principles of microservices” presentation

Choreography

Sign up service

Email sender

Delivery service

Newsletter service

user signed up

Page 153: Queues queues queues — How RabbitMQ enables reactive architectures

Choreography

Sign up service

Newsletter service

Email sender

Delivery service

RabbitMQ

Queue

Queue

signups Queue

Example use case shown by Sam Newman in “Principles of microservices” presentation

Page 154: Queues queues queues — How RabbitMQ enables reactive architectures

➔ ResponsiveUser does not have to wait for all services to complete their work, thus gets the response faster.

Choreography

Page 155: Queues queues queues — How RabbitMQ enables reactive architectures

➔ ResponsiveUser does not have to wait for all services to complete their work, thus gets the response faster.

➔ ResilientFailure is tolerated in each service separately — if one fails then the work is queued and processing will eventually still happen, after error is removed.

Choreography

Page 156: Queues queues queues — How RabbitMQ enables reactive architectures

➔ ResponsiveUser does not have to wait for all services to complete their work, thus gets the response faster.

➔ ResilientFailure is tolerated in each service separately — if one fails then the work is queued and processing will eventually still happen, after error is removed.

➔ ElasticQueue lengths can be used to scale consuming services up or down.

Choreography

Page 157: Queues queues queues — How RabbitMQ enables reactive architectures

➔ ResponsiveUser does not have to wait for all services to complete their work, thus gets the response faster.

➔ ResilientFailure is tolerated in each service separately — if one fails then the work is queued and processing will eventually still happen, after error is removed.

➔ ElasticQueue lengths can be used to scale consuming services up or down.

➔ Works well with message queues. Allows reactive architectures.

Choreography

Page 158: Queues queues queues — How RabbitMQ enables reactive architectures

So, embrace choreography wherever possible.

Page 159: Queues queues queues — How RabbitMQ enables reactive architectures

Dumb pipes,smart endpoints

Page 160: Queues queues queues — How RabbitMQ enables reactive architectures

Dumb service A

Dumb service B

Dumb service C

Dumb service D

Dumb service A

Dumb service B

Dumb service C

Dumb service D

Enterprise Service Bus

Page 161: Queues queues queues — How RabbitMQ enables reactive architectures

Dumb service A

Dumb service B

Dumb service C

Dumb service D

Dumb service A

Dumb service B

Dumb service C

Dumb service D

Magic Mystery Bus

Example credit to Sam Newman in “Principles of microservices” presentation.

Page 162: Queues queues queues — How RabbitMQ enables reactive architectures

Dumb service A

Dumb service B

Dumb service C

Dumb service D

Dumb service A

Dumb service B

Dumb service C

Dumb service D

Magic Mystery Bus

Page 163: Queues queues queues — How RabbitMQ enables reactive architectures

Dumb pipes, smart endpoints

➔ Initially, you deploy an empty RabbitMQ.

Page 164: Queues queues queues — How RabbitMQ enables reactive architectures

Dumb pipes, smart endpoints

➔ Initially, you deploy an empty RabbitMQ.

➔ Do not make RabbitMQ deployment be aware of the desired data flows.

Page 165: Queues queues queues — How RabbitMQ enables reactive architectures

Dumb pipes, smart endpoints

➔ Initially, you deploy an empty RabbitMQ.

➔ Do not make RabbitMQ deployment be aware of the desired data flows.

➔ Exchanges, bindings and queues are created by services themselves as they need.

Page 166: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ server

Basic concept

Deals service

statisticsqueue

webhookqueue

#

#.company_15

statistics service

webhook service

dealsexchange

webhook service

Page 167: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ server

Basic concept political map

Deals service

statisticsqueue

webhookqueue

#

#.company_15

statistics service

webhook service

dealsexchange

webhook service

Page 168: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ server

Basic concept political map

Deals service

statisticsqueue

webhookqueue

#

#.company_15

statistics service

webhook service

dealsexchange

webhook serviceKingdom of

Deals Service

Commonwealth of Statistics Service

Republic of Webhook Service

Page 169: Queues queues queues — How RabbitMQ enables reactive architectures

So, in essence, RabbitMQ is left with nothing but the dumb pipes.

Page 170: Queues queues queues — How RabbitMQ enables reactive architectures

Smart service A

Smart service B

Smart service C

Smart service D

Smart service A

Smart service B

Smart service C

Smart service D

Dumb pipes

Page 171: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQin the wild

Page 172: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ at Pipedrive

➔ Started using in 2012

Page 173: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ at Pipedrive

➔ Started using in 2012➔ Main backbone of async service-to-service communication

Page 174: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ at Pipedrive

➔ Started using in 2012➔ Main backbone of async service-to-service communication➔ All data change events are published to RabbitMQ.

Page 175: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ at Pipedrive

➔ Started using in 2012➔ Main backbone of async service-to-service communication➔ All data change events are published to RabbitMQ.➔ Averaging around >1,700 msg/sec. Peaking sometimes at

3,000+ msg/sec. >140M msg/day.

Page 176: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ at Pipedrive

➔ Started using in 2012➔ Main backbone of async service-to-service communication➔ All data change events are published to RabbitMQ.➔ Averaging around >1,700 msg/sec. Peaking sometimes at

3,000+ msg/sec. >140M msg/day.

Page 177: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ at Pipedrive

Page 178: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ at Pipedrive

➔ Initially deployed a 3-node cluster

MQ

MQ

MQ

Page 179: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ at Pipedrive

➔ Initially deployed a 3-node cluster➔ Then scaled it up to a 5-node cluster

MQ

MQ

MQ

MQ

MQ

MQ

MQ

MQ

Page 180: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ at Pipedrive

➔ Initially deployed a 3-node cluster➔ Then scaled it up to a 5-node cluster➔ Then decided to move to multiple 3-node clusters instead

MQ

MQ

MQ

MQ

MQ

MQ

MQ

MQ

MQ

MQ

MQ

MQ

MQ

MQ

Page 181: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ at Pipedrive

Page 182: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ at Pipedrive

➔ Started seeing networking overhead in a 5-node cluster as the load grew.

Page 183: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ at Pipedrive

➔ Started seeing networking overhead in a 5-node cluster as the load grew.

➔ Multiple clusters with semi-isolated traffic (bound by either SLA or logical service groups) was easier to handle for us.

Page 184: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ at Pipedrive

➔ Started seeing networking overhead in a 5-node cluster as the load grew.

➔ Multiple clusters with semi-isolated traffic (bound by either SLA or logical service groups) was easier to handle for us.

➔ It was a logical architecture decision, not a technical constraint — RabbitMQ does scale well beyond our load.

Page 185: Queues queues queues — How RabbitMQ enables reactive architectures

3 caveats

Page 186: Queues queues queues — How RabbitMQ enables reactive architectures

1.Who owns an exchange?

Page 187: Queues queues queues — How RabbitMQ enables reactive architectures

Exchange ownership question

Page 188: Queues queues queues — How RabbitMQ enables reactive architectures

Exchange ownership question

➔ Ultimately, every service will depend on existence of certain exchanges.

Page 189: Queues queues queues — How RabbitMQ enables reactive architectures

Exchange ownership question

➔ Ultimately, every service will depend on existence of certain exchanges.

➔ If these are missing, binding will throw an error.

Page 190: Queues queues queues — How RabbitMQ enables reactive architectures

Exchange ownership question

➔ Ultimately, every service will depend on existence of certain exchanges.

➔ If these are missing, binding will throw an error.

➔ But which service should create the exchange?There should ideally be only one owner per each exchange.

Page 191: Queues queues queues — How RabbitMQ enables reactive architectures

Exchange ownership question

➔ Ultimately, every service will depend on existence of certain exchanges.

➔ If these are missing, binding will throw an error.

➔ But which service should create the exchange?There should ideally be only one owner per each exchange.

➔ At Pipedrive, we have so far had shared exchange ownerships. Eventually it could create problems down the line as exchange properties are defined in multiple services.

Page 192: Queues queues queues — How RabbitMQ enables reactive architectures

Exchange ownership question

➔ Ultimately, every service will depend on existence of certain exchanges.

➔ If these are missing, binding will throw an error.

➔ But which service should create the exchange?There should ideally be only one owner per each exchange.

➔ At Pipedrive, we have so far had shared exchange ownerships. Eventually it could create problems down the line as exchange properties are defined in multiple services.

➔ Possible solution: die consumers when an exchange does not exist?

Page 193: Queues queues queues — How RabbitMQ enables reactive architectures

2.Adding/removing bindings is like changing a database schema

Page 194: Queues queues queues — How RabbitMQ enables reactive architectures

Adding/removing bindings is like changing schema

Page 195: Queues queues queues — How RabbitMQ enables reactive architectures

Adding/removing bindings is like changing schema

➔ With high throughput, adding and removing bindings from a busy exchange can be like changing your DB schema.

Page 196: Queues queues queues — How RabbitMQ enables reactive architectures

Adding/removing bindings is like changing schema

➔ With high throughput, adding and removing bindings from a busy exchange can be like changing your DB schema.

➔ It takes time.

Page 197: Queues queues queues — How RabbitMQ enables reactive architectures

Adding/removing bindings is like changing schema

➔ With high throughput, adding and removing bindings from a busy exchange can be like changing your DB schema.

➔ It takes time.

➔ At Pipedrive, we used to create a queue+binding for each logged in user to facilitate websocket connection back to end user’s browser.

Page 198: Queues queues queues — How RabbitMQ enables reactive architectures

Adding/removing bindings is like changing schema

➔ With high throughput, adding and removing bindings from a busy exchange can be like changing your DB schema.

➔ It takes time.

➔ At Pipedrive, we used to create a queue+binding for each logged in user to facilitate websocket connection back to end user’s browser.

➔ Don’t do it.

Page 199: Queues queues queues — How RabbitMQ enables reactive architectures

tl;dr:RabbitMQ is optimized for throughput of messages, not for throughput of schema changes on the fly.

Page 200: Queues queues queues — How RabbitMQ enables reactive architectures

At Pipedrive, we have a microservice we call socketqueue.

Page 201: Queues queues queues — How RabbitMQ enables reactive architectures

It’s a piping service betweenuser’s browser and RabbitMQ

websocket User’s browser

socketqueue(consumer)

RabbitMQ

REST APIs(publishers)

AMQPAMQP

Page 202: Queues queues queues — How RabbitMQ enables reactive architectures

Socketqueue 1.0 architecture

➔ One queue + binding per each connected user

➔ One Websocket connection per each connected user

➔ One-to-one relation between queue and websocket inside the socketqueue service.

➔ Horizontally scalable

Page 203: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ cluster

Socketqueue 1.0 architecture

REST APIs

q3

api.eventsexchange

q2

q1

socketq1

u1u2u3

q6

q5

q4

socketq2

u4u5u6

q8 socketq3

u7u8u9

q7

+ 10K more

q9

300+ msg/sec

Page 204: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ cluster

Socketqueue 1.0 architecture

REST APIs

q3

api.eventsexchange

q2

q1

socketq1

u1u2u3

q6

q5

q4

socketq2

u4u5u6

q8 socketq3

u7u8u9

q7

+ 10K more

q9

Did not scale beyond 10K queues, bindings

300+ msg/sec

Page 205: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ cluster

Socketqueue 1.0 architecture

REST APIs

q3

api.eventsexchange

q2

q1

socketq1

u1u2u3

q6

q5

q4

socketq2

u4u5u6

q8 socketq3

u7u8u9

q7

+ 10K more

q9

300+ msg/sec

Page 206: Queues queues queues — How RabbitMQ enables reactive architectures

Socketqueue 2.0 architecture

REST APIs api.eventsexchange

q-socket1 socketq1

u1u2u3

q-socket2 socketq2

u4u5u6

socketq3

u7u8u9

q-socket3

RabbitMQ cluster

300+ msg/sec

Page 207: Queues queues queues — How RabbitMQ enables reactive architectures

Socketqueue 1.0 architecture

➔ One queue + binding per each connected user

➔ One Websocket connection per each connected user

➔ One-to-one relation between queue and websocket inside the socketqueue service.

➔ Horizontally scalable

Page 208: Queues queues queues — How RabbitMQ enables reactive architectures

Socketqueue 1.02.0 architecture

➔ One queue + binding per each connected user socketqueue service instance.

➔ One Websocket connection per each connected user

➔ One-to-onemany relation between queue and websocket inside the socketqueue service.

➔ Horizontally scalable well beyond 10K simultaneous users

Page 209: Queues queues queues — How RabbitMQ enables reactive architectures

Most problematic?

Initial setup of 10K+ queues/bindings

during version upgrades, service restarts.

Page 210: Queues queues queues — How RabbitMQ enables reactive architectures

3.Delivery guarantees

Page 211: Queues queues queues — How RabbitMQ enables reactive architectures

100% delivery guarantee

=

Publisher Acknowledgements

Page 212: Queues queues queues — How RabbitMQ enables reactive architectures

Publisher Acknowledgements➔ Your service sends a persistent message to RabbitMQ

Page 213: Queues queues queues — How RabbitMQ enables reactive architectures

Publisher Acknowledgements➔ Your service sends a persistent message to RabbitMQ➔ RabbitMQ receives your message but does not yet write it to disk

Page 214: Queues queues queues — How RabbitMQ enables reactive architectures

Publisher Acknowledgements➔ Your service sends a persistent message to RabbitMQ➔ RabbitMQ receives your message but does not yet write it to disk➔ RabbitMQ tells you it has received your message

Page 215: Queues queues queues — How RabbitMQ enables reactive architectures

Publisher Acknowledgements➔ Your service sends a persistent message to RabbitMQ➔ RabbitMQ receives your message but does not yet write it to disk➔ RabbitMQ tells you it has received your message➔ The message gets routed to a durable queue

Page 216: Queues queues queues — How RabbitMQ enables reactive architectures

Publisher Acknowledgements➔ Your service sends a persistent message to RabbitMQ➔ RabbitMQ receives your message but does not yet write it to disk➔ RabbitMQ tells you it has received your message➔ The message gets routed to a durable queue➔ A consumer picks up the message and starts processing it

Page 217: Queues queues queues — How RabbitMQ enables reactive architectures

Publisher Acknowledgements➔ Your service sends a persistent message to RabbitMQ➔ RabbitMQ receives your message but does not yet write it to disk➔ RabbitMQ tells you it has received your message➔ The message gets routed to a durable queue➔ A consumer picks up the message and starts processing it➔ RabbitMQ server dies and comes back up

Page 218: Queues queues queues — How RabbitMQ enables reactive architectures

Publisher Acknowledgements➔ Your service sends a persistent message to RabbitMQ➔ RabbitMQ receives your message but does not yet write it to disk➔ RabbitMQ tells you it has received your message➔ The message gets routed to a durable queue➔ A consumer picks up the message and starts processing it➔ RabbitMQ server dies and comes back up➔ Except, that message that was being processed? It’s not there any more.

Page 219: Queues queues queues — How RabbitMQ enables reactive architectures

100% delivery guarantee

=

Publisher Acknowledgements

Page 220: Queues queues queues — How RabbitMQ enables reactive architectures

Read more from https://www.rabbitmq.com/confirms.html

Page 221: Queues queues queues — How RabbitMQ enables reactive architectures

RabbitMQ elsewhere

Page 222: Queues queues queues — How RabbitMQ enables reactive architectures

https://blog.pivotal.io/pivotal/products/rabbitmq-hits-one-million-messages-per-second-on-google-compute-engine

Page 223: Queues queues queues — How RabbitMQ enables reactive architectures

1 millionmessages per second

Page 224: Queues queues queues — How RabbitMQ enables reactive architectures

1,000,000messages per second

Page 225: Queues queues queues — How RabbitMQ enables reactive architectures

86,400,000,000messages per day

Page 226: Queues queues queues — How RabbitMQ enables reactive architectures
Page 227: Queues queues queues — How RabbitMQ enables reactive architectures

To put this into context...

Page 228: Queues queues queues — How RabbitMQ enables reactive architectures

11B2014 all of SMS traffic

per day globally

http://techcrunch.com/2015/04/22/facebook-voip-not-facebook-phone/http://www.openuniversity.edu/news/news/2014-text-messaging-usage-statisticshttp://www.businessinsider.com/eddy-cue-200k-imessages-per-second-2016-2

Page 229: Queues queues queues — How RabbitMQ enables reactive architectures

17.2B

11B2014 all of SMS traffic

per day globally

2016 Apple iMessages per day globally

http://techcrunch.com/2015/04/22/facebook-voip-not-facebook-phone/http://www.openuniversity.edu/news/news/2014-text-messaging-usage-statisticshttp://www.businessinsider.com/eddy-cue-200k-imessages-per-second-2016-2

Page 230: Queues queues queues — How RabbitMQ enables reactive architectures

17.2B

11B2014 all of SMS traffic

per day globally

2016 Apple iMessages per day globally

Facebook, Messenger, and WhatsApp per day

combined

45B

http://techcrunch.com/2015/04/22/facebook-voip-not-facebook-phone/http://www.openuniversity.edu/news/news/2014-text-messaging-usage-statisticshttp://www.businessinsider.com/eddy-cue-200k-imessages-per-second-2016-2

Page 231: Queues queues queues — How RabbitMQ enables reactive architectures

86.4B

17.2B

11B2014 all of SMS traffic

per day globally

2016 Apple iMessages per day globally

That single RabbitMQ experiment

Facebook, Messenger, and WhatsApp per day

combined

45B

http://techcrunch.com/2015/04/22/facebook-voip-not-facebook-phone/http://www.openuniversity.edu/news/news/2014-text-messaging-usage-statisticshttp://www.businessinsider.com/eddy-cue-200k-imessages-per-second-2016-2

Page 232: Queues queues queues — How RabbitMQ enables reactive architectures

I think that’s pretty remarkable.

Page 233: Queues queues queues — How RabbitMQ enables reactive architectures
Page 234: Queues queues queues — How RabbitMQ enables reactive architectures

Thank you.

Martin Tajur@tajur on Twitter

With this promo code

DEVCLUBEE2 months freewww.pipedrive.com

Page 235: Queues queues queues — How RabbitMQ enables reactive architectures

Thank you.

Martin Tajur@tajur on Twitter

With this promo code

DEVCLUBEE2 months freewww.pipedrive.com

We’re hiring.

Page 236: Queues queues queues — How RabbitMQ enables reactive architectures

Questions/Answers