Slide 1

Slide 1 text

Messaging Standards and Systems AMQP & RabbitMQ Gavin M. Roy VP of Architecture AWeber Communications Twitter: @Crad All Things Open October 22, 2014

Slide 2

Slide 2 text

About Me VP of Architecture
 AWeber Communications Blame me for pika, rabbitpy, pamqp, and a handful of RabbitMQ plugins Blog: https://gavinroy.com Github: https://github.com/gmr Book: http://manning.com/roy

Slide 3

Slide 3 text

Advanced Message Queueing Protocol ❖ Open Standard ❖ Platform and Vendor Neutral ❖ Multiple Versions

Slide 4

Slide 4 text

AMQP Timeline 2003 2005 2006 2008 2011 Initial Specification Working Group formed AMQP 0-8 AMQP 0-9-1 OASIS AMQP 1.0

Slide 5

Slide 5 text

AMQP Working Group ❖ JPMorgan Chase ❖ Cisco Systems ❖ IONA Technologies ❖ iMatrix ❖ RedHat ❖ TWIST ❖ Bank of America ❖ Barclays ❖ Credit Suisse ❖ Deutsche Börse Systems ❖ Goldman Sachs ❖ HCL Technologies ❖ Progress Software ❖ IIT Software ❖ INETCO Systems Ltd. ❖ Informatica Corporation ❖ Microsoft Corporation ❖ my-Channels ❖ Novell ❖ Solace Systems ❖ Tervala, Inc. ❖ VMWare ❖ WSO2

Slide 6

Slide 6 text

Competing AMQP Standards ≠ 0-8 & 0-9-1 1.0

Slide 7

Slide 7 text

AMQP 0-9-1 ❖ Currently has wider support than AMQP 1.0 ❖ Multiple Broker Implementations: 
 RabbitMQ, Apache Qpid, and SwiftMQ to name a few ❖ Specifies a Model and Protocol

Slide 8

Slide 8 text

Native AMQP 0-8/0-9-1 Clients C Clojure Cobol Common Lisp Delphi Erlang Go Groovy Haskell Java JavaScript .NET OCaml Perl PHP Python Ruby Scala

Slide 9

Slide 9 text

❖ Exchange
 Receives and route messages ❖ Message Queue
 Stores messages until they can be
 consumed ❖ Binding
 Defines the relationship between an Exchange and Queue and provides routing criteria Advanced Message Queueing Model X Exchange Binding Message Queue

Slide 10

Slide 10 text

Routing Keys ❖ Provided when publishing a message ❖ Compared against binding keys by exchanges ❖ Ideally provide context to the message: ❖ Connote the type of the message ❖ Categorize the content in the message ❖ Specify the type of consumer that should receive it

Slide 11

Slide 11 text

Advanced Message Queueing Protocol ❖ Compact, binary frame format wire protocol ❖ Bi-directional RPC ❖ Commands consist of Classes and Methods: ❖ Example Request:
 
 Queue.Declare(name=“foo”) ❖ Response:
 
 Queue.DeclareOk(messages=0, consumers=0)

Slide 12

Slide 12 text

Common AMQP Terms ❖ Broker
 A server that implements AMQP ❖ Producer or Publisher
 A client application that sends messages to a broker ❖ Consumer
 A client application that reads messages from a queue

Slide 13

Slide 13 text

Publishers and Consumers C P

Slide 14

Slide 14 text

Multiple Publishers C P P P

Slide 15

Slide 15 text

Multiple Consumers C C C P

Slide 16

Slide 16 text

AMQP Messages ❖ Comprised of 3 or more frames: ❖ Method Frame
 Basic.Publish, Basic.Deliver, etc ❖ Content Header with body size & message properties 
 timestamp, message-id, app-id, etc ❖ n Body Frames with the opaque message payload

Slide 17

Slide 17 text

AMQP 0-9-1 Issues & Gotchas ❖ Ambiguous ❖ Authentication ❖ Asynchronous ❖ Connection Negotiation ❖ Exceptions !

Slide 18

Slide 18 text

RabbitMQ ❖ Open Source (MPL) ❖ Written in Erlang/OTP ❖ Developed/Maintained by Pivotal ❖ Multi-Protocol
 AMQP 0-9-1 & 1.0, MQTT, STOMP, XMPP, HTTP, Web-STOMP & More ❖ Roots in AMQP 0-8/0-9-1

Slide 19

Slide 19 text

Who Uses It? Agora Games Chef Google AdMob Instagram MeetMe Mercado Libre Mozilla NASA New York Times National Science Foundation Openstack Rapportive Reddit Soundcloud (and many more)

Slide 20

Slide 20 text

Why Use RabbitMQ? ❖ Create loosely-coupled applications ❖ Communicate across applications or platforms ❖ Tap into pre-existing message flows for new purposes ❖ Scale-out clustering for growth, throughput, and HA ❖ Federation for WAN latencies and network partitions ❖ Extensible plugin-in architecture

Slide 21

Slide 21 text

RabbitMQ Extensions to AMQP Authentication Failure Exchange to Exchange Bindings Delivery Confirmations Basic.Nack Consumer cancellations Consumer priorities Dead Letter Exchanges Alternate Exchanges Connection blocking Message CC & BCC Routing Queue Length Limits Per Queue Message TTL Per Message TTL Queue TTL Message User ID Validation Auto-delete exchanges

Slide 22

Slide 22 text

RabbitMQ Clustering ❖ LAN Only ❖ Adds highly-available queues ❖ Is cohesive, publish and consume from any node ❖ Leverages native Erlang clustering and communication ❖ Has multiple strategies for dealing with network partitions ❖ Manually configured via configuration or command line*

Slide 23

Slide 23 text

RabbitMQ Plugins auth-backend-amqp
 Use AMQP to respond to RabbitMQ auth requests auth-backend-http
 Use a custom web service to provide authentication autocluster-consul
 Automatically create clusters using Consul influxdb-storage-exchange
 Store JSON messages as events in InfluxDB presence-exchange
 Publishes messages upon binding changes rabbitmq-toke
 Tokyo Cabinet backing store for queue messages rabbitmq-top
 Top like view of RabbitMQ processes in the management UI sharding
 Scale out RabbitMQ with automatic queue sharding (and many more)

Slide 24

Slide 24 text

Message Routing

Slide 25

Slide 25 text

Built-In Exchange Types ❖ Direct
 String matching on the routing key ❖ Fanout
 No routing key, messages delivered to all bound queues ❖ Topic
 Pattern matching in the routing key ❖ Headers
 No routing key, value matching in the headers property

Slide 26

Slide 26 text

Topic Exchange Binding Keys Routing Key: namespace.delimited.keys #
 Receive all messages namespace.#
 Receive all messages in namespace namespace.delimited.*
 Receive all namespace.delimited messages namespace.*.keys
 Receive all namespace messages ending with keys

Slide 27

Slide 27 text

Exchange to Exchange Binding X X X Queue Queue Queue Queue Queue Queue Messages published into a topic exchange are routed to two other exchanges and a queue Messages published into the consistent-hashing exchange are distributed amongst three queues Messages published into a direct exchange routed to two queues P

Slide 28

Slide 28 text

Alternate Exchanges P X Unroutable Messages X Unroutable messages are sent to an alternate exchange

Slide 29

Slide 29 text

Dead Letter Exchanges P X Reject Queue Queue C X Consumer rejects the message without requeue Dead-Letter Exchange routes the message

Slide 30

Slide 30 text

Exchange Plugins Consistent Hashing
 Distribute messages via hashed value of routing key Event
 Publishes messages on AMQP events such as queue creation Random
 Distribute messages across all bound queues randomly PostgreSQL LISTEN
 Subscribes to and publishes PostgreSQL notifications Recent History
 Sends the last n messages to any newly bound queue Reverse Topic
 Allows for routing patterns at publish time and not via binding Riak Storage
 Stores messages published through the exchange into Riak Script Exchange
 Calls out to external scripts for message routing

Slide 31

Slide 31 text

Performance Considerations

Slide 32

Slide 32 text

Publishing Performance Scale Persisted M essages Transactions H A Q ueues Publisher confirm s N o guarantees N otification on failure Alternate exchanges H A Q ueues w / Transactions

Slide 33

Slide 33 text

Persisted Messages IO Model Disk Queue Message Queue Queue Messages with delivery-mode 2 sent into RabbitMQ are persisted to disk Pointers to the message are placed in the queue data structures When the message is no longer in a queue, it is removed from disk

Slide 34

Slide 34 text

HA Queues & Performance Queue Queue Queue P RabbitMQ Cluster A publisher sends to any node in a RabbitMQ cluster The RabbitMQ servers in the cluster synchronize the state of the message in the queue The message that was published is put in the queue and is stored on each server

Slide 35

Slide 35 text

Consumer Performance Scale G etting M essages C onsum ing and using Transactions C onsum e w ith Acknow ledgem ents C onsum ing w ith "N o Ack M ode" enabled C onsum ing w ith Acknow ledgem ents and Q oS > 1

Slide 36

Slide 36 text

Operational Concerns

Slide 37

Slide 37 text

Trending & Monitoring ❖ RabbitMQ Management Plugin provides internal stats ❖ Queue depths, connection counts, throughput, memory usage, etc ❖ Monitor with common tools such as Nagios or Sensu to services such as Boundary and NewRelic ❖ Stream based monitoring with Riemann for anomaly detection

Slide 38

Slide 38 text

Thoughts on Configuration ❖ Use configuration management! ❖ Even for exchanges, queues, and bindings if possible ❖ Helpful for disaster recovery ❖ Use RabbitMQ’s Policies when possible ❖ Exchanges and queues are immutable ❖ Deleting and redeclaring for changes can be disruptive

Slide 39

Slide 39 text

Sample Usage Patterns

Slide 40

Slide 40 text

Evolve Tightly-Coupled Applications Application DB

Slide 41

Slide 41 text

Decoupling Database Writes Application C DB

Slide 42

Slide 42 text

Listen for Database Notifications X Queue

Slide 43

Slide 43 text

Multi-Purposed Messages C C C P Queue DB Cloud Graphite Queue Queue X

Slide 44

Slide 44 text

RPC C / P C / P P / C C / P Response Queue X X Worker Queue Front-end web app receives a request Internet App publishes RPC request One of the subscribed worker consumers receives the RPC request After processing the request, the worker publishes the reply App receives the reply from the response queue App replies to client

Slide 45

Slide 45 text

Delayed Messages WARNING: This pattern is a hack and can cause undesirable situations should the wait queue overwhelm the system! P X X Wait Queue Ready Queue C The wait queue is declared with a message TTL and a dead-letter exchange Messages that will be delivered later are routed to a wait queue When a message times out due to the TTL, it is published to the DLX The internally re-published message is routed to the queue with active consumers

Slide 46

Slide 46 text

Questions? manning.com Discount code ato2014cftw