SlideShare a Scribd company logo
The Future of Messaging:
 RabbitMQ and AMQP

           Eberhard Wolff
Architecture & Technology Manager
       adesso AG, Germany
About me
•    Eberhard Wolff
•    Architecture & Technology Manager at adesso
•    adesso is a leading IT consultancy in Germany
•    Speaker
•    Author (i.e. first German Spring book)
•    Blog: http://ewolff.com
•    Twitter: @ewolff
•    eberhard.wolff@adesso.de
Overview
•  Why Messaging, AMQP and RabbitMQ

•  Basic AMQP

•  Advanced AMQP

•  Advanced Spring-AMQP
RPC
•  Predominant approach
  –  RMI, SOAP Web Services, CORBA, HttpInvoker,
     Burlap, Hessian
•  Calls remote methods with parameter
•  …and waits for response
•  Problems:
  –  Explicitly tells the server what to do i.e. tight
     coupling
  –  What about network failures?
  –  What about long latencies?
Why Messaging?
•  Decoupling
  –  Data, no action i.e. receiver
                                     Component
     can react arbitrarily
  –  Asynchronous i.e. decoupled
     by time
•  Reliable
  –  Message can be stored-and-
                                     Component
     forwarded
                                                 Messages
  –  Redelivery until message
     processed
•  Solves typical problems of
   distributed systems
Why Messaging?
•  But: Requires different architecture
•  Very different from calling remote methods
•  Asynchronous

•  AJAX has the same model

•  See for example “Patterns of Enterprise
   Integration”
Why AMQP?
•  Open standard protocol
•  Standard wire protocol
•  i.e. just one client library – no matter which
   implementation you are using
•  Less vendor lock in
•  Efficient
 –  Binary wire protocol
•  Support in all major languages
•  Supported on most OS platforms
What about JMS?
•  JMS has been the default for Java messaging
   system for 10+ years
•  But:
  •  Only standardized on the API level
  •  Less flexible than AMQP
•  Mapping AMQP/JMS is being defined
•  There is
   git://github.com/pieterh/openamq-jms.git
Why Rabbit?
•    Because it has a kewl name
•    Numerous protocols supported
•    Most popular choice on EC2
•    Foundation for demanding systems e.g.
     NASA’s cloud initiative Nebula
•    Implemented in Erlang
•    Clustering built in
•    Currently in 2.4.1
•    Supports AMQP 0.8, 0.9, 0.9.1
Broad Support in RabbitMQ
Broad Support in the JVM Space
•  Grails Plug In
•  Java Client
•  Scala / Lift support

•  We will discuss Spring support in detail
•  Spring AMQP project 1.0.0.RC1
•  http://www.springsource.org/spring-amqp
Why Erlang?
•  Originally designed for telephone
   switches by Ericsson
•  Much easier to develop scalable and fault
   tolerant systems (by factors)
•  See Motorola presentation:
   http://www.slideshare.net/Arbow/comparing-
   cpp-and-erlang-for-motorola-telecoms-
   software
•  Good tool for reliable and scalable systems
Erlang‘s Model
                      Monitor
Link to monitor,
restart



  Light               Light                 Light
  weight    Messages weight     Messages    weight
 process             process               process
   with                with                  with
   state               state                 state
Why Erlang?
•  Let it crash
  –  If a process fails, it can be easily restarted
  –  Different approach to fault tolerance
  –  Otherwise lots of error handling
•  Message Passing in the Core
  –  RabbitMQ is a messaging system…
•  Light-weight process model
  –  Scalabiliy
Very Basic AMQP
•  Queues: Store messages
•  Queues might be
     –  Durable: Survive server restarts
     –  Exclusive: For one connection
     –  autoDelete: Deleted if connection closes
•    Queue usually created by consumer
•    All resources are dynamic
•    Producer sends a message to a Queue
•    Let’s see some code…
Spring’s RabbitTemplate
•  Send & receive message
•  AmqpTemplate: Generic AMQP interface
•  RabbitOperations: Rabbit specific interface:
   (adds just a callback)
•  RabbitTemplate: Implementation
•  Spring might provide support for other AMQP
   implementations later
•  Common interface
Spring’s MessageConverter
•  Messages are binary data
•  RabbitTemplate uses MessageConverter
   to convert between objects and messages
•  Can also send binary data if preferred
•  Default: SimpleMessageConverter
  –  byte[] directly transferred
  –  String converted with configurable encoding
  –  Serializable are serialized
  –  Content type set accordingly
•  JsonMessageConverter converts from / to JSON
   using Jackson
•  MarshallingMessageConverter converts from / to XML
   using Spring's OXM mapping
Spring‘s AdminTemplate
•  Main purpose: Configure the AMQP
   infrastructure
•  E.g. create queues

•  AmpqAdmin: Generic AMQP interface
•  RabbitAdmin: Rabbit specific
Code
ConnectionFactory conFactory =	
   new SingleConnectionFactory("localhost");	
RabbitTemplate template = 	
  new RabbitTemplate(conFactory);	
RabbitAdmin admin = new RabbitAdmin(conFactory);	
	
admin.declareQueue(new Queue("myQueue"));	
	
template.convertAndSend("myQueue", "Hi AMQP!");	
String receive =	
  (String) template.receiveAndConvert("myQueue");	
Assert.assertEquals("Hi AMQP!", receive);
Basics of AMQP
•  Sending messages directly to queues is not
   enough
•  What about e.g. pub / sub?

•  Exchange: Route messages (stateless)
•  Messages are byte-streams
•  Example used the default exchange

•  More dynamic, flexible and cleaner than JMS
AMQP	
  in	
  a	
  nutshell	
  
Exchange routes message
Stateless
Usually created by producer
No queue: Message discarded
           X

               Binding binds an
               Exchange to a Queue    Queues buffer
                                      messages
                                      Usually created by
                                      consumer
AMQP	
  in	
  a	
  nutshell	
  
Producer and Consumer might be written in Java, C#,
Python, Ruby …

                                                      C
        P          X

                                                      C


        AMQP             RabbitMQ               AMQP
        protocol                                protocol
Exchange: Route Messages                  X


•  The type of Exchange defined the routing
   algorithm used
•  Binding provides selector for routing
•  Exchange is addressed by name

•  Some standard types
•  Can provide additional ones
Fanout Exchange         X


•  Broadcast to all bound queues
•  Fast
•  Simple

•  amq.fanout is mandatory

•  To broadcast information
Fanout Exchange       X




                      C
P     X

                      C
    Fanout
                      C
Queue fanoutQueue = new Queue("fanoutQueue");	
admin.declareQueue(fanoutQueue);	
	
FanoutExchange fanoutExchange=	
  new FanoutExchange("myFanout");	
admin.declareExchange(fanoutExchange);	
	
admin.declareBinding(	
  BindingBuilder.from(fanoutQueue).	
                 to(fanoutExchange));	
	
template.setExchange("myFanout");	
template.convertAndSend("Hi Fanout!");	
	
String receive = (String)	
   template.receiveAndConvert("fanoutQueue");	
Assert.assertEquals("Hi Fanout!", receive);
Direct Exchange                   X


•  Routing based on one routing key
•  amq.direct and the default Exchange (no
   name) always exist

•  To send work orders to a specific worker
Direct Exchange

normal
express
          Direct
          Exchange                 C
                     express
   P         X

                                   C
                 normal
                                   C
Queue directQueue = new Queue("direct");	
admin.declareQueue(directQueue);	
	
admin.declareBinding(BindingBuilder	
   .from(directQueue)	
   .to(new DirectExchange("amq.direct"))	
   .with("helloKey"));	
template.setExchange("amq.direct");	
	
template.convertAndSend("amq.direct","dropMe",	
  "I will be dropped!");	
template.convertAndSend("amq.direct","helloKey",	
  "Hi Direct!");	
Assert.assertEquals("Hi Direct!",	
  template.receiveAndConvert("direct"));	
Assert.assertNull(	
  template.receiveAndConvert("direct"));
Topic Exchange                X


•  Routing based on routing pattern
•  amq.topic is mandatory

•  E.g. for public / subscribe scenarios
Topic Exchange	
  

 order.DE
invoice.USD
         Topic
         Exchange
                    order.*
    P      X                         C


               invoice.*
                                     C
Headers Exchange                    X


•  Routing based on one or more headers and
   an expression
•  amqp.match is mandatory

•  Complex routing roles
Other Features
•  Message can be persistent
•  Request / response using correlations
   possible

•  Redelivery / acknowledgement possible

•  Clustering with e.g. Linux HA possible
•  ...or send message through multiple channels
   and drop duplicates
More about
RabbitMQ and Spring
Configuring Rabbit Resources with
             Spring
•  Spring enables decoupling of your application
   code from the underlying infrastructure

•  The container provides the resources

•  The application is simply coded against the
   API
Configuring a ConnectionFactory
<bean id="connectionFactory"
       class="org.sfw.amqp.rabbit.connection.SingleConnectionFactory">
  <property name="username" value="guest"/>
  <property name="password" value="guest"/>
   <constructor-arg value="localhost" />
</bean>

•  Can easily modify configuration options
Defining a RabbitTemplate Bean
 •  Provide a reference to the ConnectionFactory
 •  Optionally provide other references
     –  MessageConverter
     –  Routing key and exchange to be used if none is
        specified
<bean id="rabbitTemplate"
      class="org.springframework.amqp.rabbit.core.RabbitTemplate">
  <constructor-arg ref="connectionFactory" />
  <property name="routingKey" value=”invoice.USD" />
</bean>
The MessageListener
•  So far: Calling receive() on RabbitTemplate
•  Needed: Something that is called when a new
   message appears
•  The API defines this interface for
   asynchronous reception of messages
        public void onMessage(Message) {
          // handle the message
        }
Spring’s MessageListener
              Container
•  Spring provides lightweight containers to call
   MessageListeners
•  SimpleMessageListenerContainer
•  Advanced scheduling and endpoint
   management options available
•  i.e. thread pools, concurrent consumers,
   transaction handling
Defining a Message Listener
                Container
<bean class="org.sfw.amqp.rabbit.listener.SimpleMessageListenerContainer">
 <property name="connectionFactory" ref="connectionFactory" />
 <property name="queueNames" value="my.amqp.queue" />
 <property name="messageListener" ref="messageListener" />
</bean>


•  Every time a new message appears on
   my.amqp.queue the messageListener is
   called
Spring's message-driven objects
•  MessageListener means the receiver
   depends on Spring API
•  Why not just a POJO?
•  MessageListenerAdapter takes a POJO and
   makes it a MessageListener
•  i.e. calls consume on Bean consumer
<bean id="messageListenerAdapter"
        class="org.sfw.amqp.rabbit.listener.adapter.MessageListenerAdapter">
  <property name="delegate" ref="consumer" />
  <property name="defaultListenerMethod" value="consume" />
  <property name="messageConverter" ref="jsonMessageConverter" />
</bean>
Easier Using Namespaces
<rabbit:listener-container
 connection-factory="connectionFactory“
 message-converter="jsonMessageConverter">
    <rabbit:listener ref="consumer" method="consume"
                     queue-names="my.amqp.queue2" />
</rabbit:listener-container>


•  Results in the same Spring Beans
Consumer code
@Component	
public class Consumer {	
	
  public String consume(String message) {	
     return …;	
  }	
}

•  No dependency on AMQP!
•  But: What about the result of the method?
•  Send to the Reply-To address given in
   message properties with same correlationId
   as original method
Client Code
String response = (String) 	
  rabbitOperations.convertSendAndReceive(	
    "my.fanout", "", "test");

•  Message sent to destination with routing key
•  Reply-To set to exclusive, autodelete, non-
   durable queue
•  Response received through Reply-To
   converted and returned
•  Easy request-response!
•  Beware of potential latency
Create Environment
               Using Namespaces
<rabbit:fanout-exchange name="my.fanout2">
 <rabbit:bindings>
   <rabbit:binding queue="my.amqp.queue2" />
 </rabbit:bindings>
</rabbit:fanout-exchange>
<rabbit:queue name="my.amqp.queue2" />



•  ...if you don‘t like API calls
Conclusion: AMQP
•    Ubiquitous Messaging
•    AMQP: Protocol standard
•    Better scalability
•    Dynamic resources
Conclusion: Spring AMQP
•    Easy to use
•    Flexible (e.g. message encoding)
•    Allows scalable message handling
•    Full support for AMQP and RabbitMQ
More
•  http://springsource.org/spring-amqp
•  Also a .NET version available
•  …and support Spring Integration
•  http://blog.springsource.com/2011/04/01/
   routing-topologies-for-performance-and-
   scalability-with-rabbitm
•  Transaction support

•  …and there is very similar JMS support 

More Related Content

PDF
Architecture | The Future of Messaging: RabbitMQ and AMQP | Eberhard Wolff
PDF
Messaging with RabbitMQ and AMQP
PDF
Rabbitmq, amqp Intro - Messaging Patterns
PDF
Messaging with amqp and rabbitmq
PDF
Messaging Standards and Systems - AMQP & RabbitMQ
PDF
Introduction to AMQP Messaging with RabbitMQ
PPTX
The RabbitMQ Message Broker
PPTX
Spring RabbitMQ
Architecture | The Future of Messaging: RabbitMQ and AMQP | Eberhard Wolff
Messaging with RabbitMQ and AMQP
Rabbitmq, amqp Intro - Messaging Patterns
Messaging with amqp and rabbitmq
Messaging Standards and Systems - AMQP & RabbitMQ
Introduction to AMQP Messaging with RabbitMQ
The RabbitMQ Message Broker
Spring RabbitMQ

What's hot (20)

PPTX
Spring RabbitMQ
PDF
Scaling applications with RabbitMQ at SunshinePHP
PDF
Distributed messaging with AMQP
PPTX
High powered messaging with RabbitMQ
PDF
Messaging in the Cloud - AMQP, RabbitMQ and Spring
ODP
Introduction To RabbitMQ
PDF
[@NaukriEngineering] Messaging Queues
PDF
Practical Message Queuing Using RabbitMQ (PHPem, 3rd July 2014)
PPTX
Rabbit MQ introduction
PPTX
Message Broker System and RabbitMQ
PPTX
RabbitMQ vs Apache Kafka Part II Webinar
PDF
Messaging Standards and Systems - AMQP & RabbitMQ
PDF
A Closer Look at RabbitMQ
PDF
Full Stack Bus with Javascript, RabbitMQ and Postal.js
PPT
Easy enterprise application integration with RabbitMQ and AMQP
PDF
Alvaro Videla, Building a Distributed Data Ingestion System with RabbitMQ
PDF
AMQP for phpMelb
PDF
AMQP with RabbitMQ
PPT
Amqp Basic
PDF
Spring RabbitMQ
Scaling applications with RabbitMQ at SunshinePHP
Distributed messaging with AMQP
High powered messaging with RabbitMQ
Messaging in the Cloud - AMQP, RabbitMQ and Spring
Introduction To RabbitMQ
[@NaukriEngineering] Messaging Queues
Practical Message Queuing Using RabbitMQ (PHPem, 3rd July 2014)
Rabbit MQ introduction
Message Broker System and RabbitMQ
RabbitMQ vs Apache Kafka Part II Webinar
Messaging Standards and Systems - AMQP & RabbitMQ
A Closer Look at RabbitMQ
Full Stack Bus with Javascript, RabbitMQ and Postal.js
Easy enterprise application integration with RabbitMQ and AMQP
Alvaro Videla, Building a Distributed Data Ingestion System with RabbitMQ
AMQP for phpMelb
AMQP with RabbitMQ
Amqp Basic
Ad

Viewers also liked (7)

PDF
MongoUK 2011 - Rplacing RabbitMQ with MongoDB
PDF
Introduction to RabbitMQ | Meetup at Pivotal Labs
PDF
RabbitMQ Data Ingestion
PDF
Rabbitmq an amqp message broker
PDF
dubizzle's Guide to RabbitMQ
PDF
10 Ways Your Boss Kills Employee Motivation
PPTX
Top 5 Deep Learning and AI Stories - October 6, 2017
MongoUK 2011 - Rplacing RabbitMQ with MongoDB
Introduction to RabbitMQ | Meetup at Pivotal Labs
RabbitMQ Data Ingestion
Rabbitmq an amqp message broker
dubizzle's Guide to RabbitMQ
10 Ways Your Boss Kills Employee Motivation
Top 5 Deep Learning and AI Stories - October 6, 2017
Ad

Similar to The Future of Messaging: RabbitMQ and AMQP (20)

PDF
Enterprise Messaging with RabbitMQ.pdf
PDF
Multiply like rabbits with rabbit mq
PDF
Multiply like rabbits with rabbit mq
PDF
Messaging in Java
PPTX
RabbitMQ and AMQP with .net client library
PPT
Rabbit MQ introduction
PDF
RabbitMQ with python and ruby RuPy 2009
PPTX
Rabbit MQ
PPTX
RabbitMQ and EasyNetQ
PDF
Follow the White Rabbit - Message Queues with PHP
PDF
Lindsay distributed geventzmq
PDF
Enterprise messaging
KEY
High scale flavour
PDF
RabbitMQ fairly-indepth
PDF
Ruby Microservices with RabbitMQ
KEY
Real time system_performance_mon
KEY
Message Queueing - by an MQ noob
PDF
CBDW2014 - Down the RabbitMQ hole with ColdFusion
KEY
Message queueing
Enterprise Messaging with RabbitMQ.pdf
Multiply like rabbits with rabbit mq
Multiply like rabbits with rabbit mq
Messaging in Java
RabbitMQ and AMQP with .net client library
Rabbit MQ introduction
RabbitMQ with python and ruby RuPy 2009
Rabbit MQ
RabbitMQ and EasyNetQ
Follow the White Rabbit - Message Queues with PHP
Lindsay distributed geventzmq
Enterprise messaging
High scale flavour
RabbitMQ fairly-indepth
Ruby Microservices with RabbitMQ
Real time system_performance_mon
Message Queueing - by an MQ noob
CBDW2014 - Down the RabbitMQ hole with ColdFusion
Message queueing

More from Eberhard Wolff (20)

PDF
Architectures and Alternatives
PDF
Beyond Microservices
PDF
The Frontiers of Continuous Delivery
PDF
Four Times Microservices - REST, Kubernetes, UI Integration, Async
PDF
Microservices - not just with Java
PDF
Deployment - Done Right!
PDF
Data Architecture not Just for Microservices
PDF
How to Split Your System into Microservices
PDF
Microservices and Self-contained System to Scale Agile
PDF
How Small Can Java Microservices Be?
PDF
Data Architecturen Not Just for Microservices
PDF
Microservices: Redundancy=Maintainability
PDF
Self-contained Systems: A Different Approach to Microservices
PDF
Microservices Technology Stack
PDF
Software Architecture for Innovation
PDF
Five (easy?) Steps Towards Continuous Delivery
PDF
Nanoservices and Microservices with Java
PDF
Microservices: Architecture to Support Agile
PDF
Microservices: Architecture to scale Agile
PDF
Microservices, DevOps, Continuous Delivery – More Than Three Buzzwords
Architectures and Alternatives
Beyond Microservices
The Frontiers of Continuous Delivery
Four Times Microservices - REST, Kubernetes, UI Integration, Async
Microservices - not just with Java
Deployment - Done Right!
Data Architecture not Just for Microservices
How to Split Your System into Microservices
Microservices and Self-contained System to Scale Agile
How Small Can Java Microservices Be?
Data Architecturen Not Just for Microservices
Microservices: Redundancy=Maintainability
Self-contained Systems: A Different Approach to Microservices
Microservices Technology Stack
Software Architecture for Innovation
Five (easy?) Steps Towards Continuous Delivery
Nanoservices and Microservices with Java
Microservices: Architecture to Support Agile
Microservices: Architecture to scale Agile
Microservices, DevOps, Continuous Delivery – More Than Three Buzzwords

Recently uploaded (20)

PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
DOCX
The AUB Centre for AI in Media Proposal.docx
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PPTX
Cloud computing and distributed systems.
PDF
Review of recent advances in non-invasive hemoglobin estimation
PPTX
A Presentation on Artificial Intelligence
PDF
NewMind AI Monthly Chronicles - July 2025
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PPTX
Big Data Technologies - Introduction.pptx
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
CIFDAQ's Market Insight: SEC Turns Pro Crypto
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PDF
Electronic commerce courselecture one. Pdf
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
The AUB Centre for AI in Media Proposal.docx
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
Network Security Unit 5.pdf for BCA BBA.
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Cloud computing and distributed systems.
Review of recent advances in non-invasive hemoglobin estimation
A Presentation on Artificial Intelligence
NewMind AI Monthly Chronicles - July 2025
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Big Data Technologies - Introduction.pptx
The Rise and Fall of 3GPP – Time for a Sabbatical?
Diabetes mellitus diagnosis method based random forest with bat algorithm
Reach Out and Touch Someone: Haptics and Empathic Computing
Chapter 3 Spatial Domain Image Processing.pdf
CIFDAQ's Market Insight: SEC Turns Pro Crypto
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
Electronic commerce courselecture one. Pdf
Unlocking AI with Model Context Protocol (MCP)
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows

The Future of Messaging: RabbitMQ and AMQP

  • 1. The Future of Messaging: RabbitMQ and AMQP Eberhard Wolff Architecture & Technology Manager adesso AG, Germany
  • 2. About me •  Eberhard Wolff •  Architecture & Technology Manager at adesso •  adesso is a leading IT consultancy in Germany •  Speaker •  Author (i.e. first German Spring book) •  Blog: http://ewolff.com •  Twitter: @ewolff •  eberhard.wolff@adesso.de
  • 3. Overview •  Why Messaging, AMQP and RabbitMQ •  Basic AMQP •  Advanced AMQP •  Advanced Spring-AMQP
  • 4. RPC •  Predominant approach –  RMI, SOAP Web Services, CORBA, HttpInvoker, Burlap, Hessian •  Calls remote methods with parameter •  …and waits for response •  Problems: –  Explicitly tells the server what to do i.e. tight coupling –  What about network failures? –  What about long latencies?
  • 5. Why Messaging? •  Decoupling –  Data, no action i.e. receiver Component can react arbitrarily –  Asynchronous i.e. decoupled by time •  Reliable –  Message can be stored-and- Component forwarded Messages –  Redelivery until message processed •  Solves typical problems of distributed systems
  • 6. Why Messaging? •  But: Requires different architecture •  Very different from calling remote methods •  Asynchronous •  AJAX has the same model •  See for example “Patterns of Enterprise Integration”
  • 7. Why AMQP? •  Open standard protocol •  Standard wire protocol •  i.e. just one client library – no matter which implementation you are using •  Less vendor lock in •  Efficient –  Binary wire protocol •  Support in all major languages •  Supported on most OS platforms
  • 8. What about JMS? •  JMS has been the default for Java messaging system for 10+ years •  But: •  Only standardized on the API level •  Less flexible than AMQP •  Mapping AMQP/JMS is being defined •  There is git://github.com/pieterh/openamq-jms.git
  • 9. Why Rabbit? •  Because it has a kewl name •  Numerous protocols supported •  Most popular choice on EC2 •  Foundation for demanding systems e.g. NASA’s cloud initiative Nebula •  Implemented in Erlang •  Clustering built in •  Currently in 2.4.1 •  Supports AMQP 0.8, 0.9, 0.9.1
  • 10. Broad Support in RabbitMQ
  • 11. Broad Support in the JVM Space •  Grails Plug In •  Java Client •  Scala / Lift support •  We will discuss Spring support in detail •  Spring AMQP project 1.0.0.RC1 •  http://www.springsource.org/spring-amqp
  • 12. Why Erlang? •  Originally designed for telephone switches by Ericsson •  Much easier to develop scalable and fault tolerant systems (by factors) •  See Motorola presentation: http://www.slideshare.net/Arbow/comparing- cpp-and-erlang-for-motorola-telecoms- software •  Good tool for reliable and scalable systems
  • 13. Erlang‘s Model Monitor Link to monitor, restart Light Light Light weight Messages weight Messages weight process process process with with with state state state
  • 14. Why Erlang? •  Let it crash –  If a process fails, it can be easily restarted –  Different approach to fault tolerance –  Otherwise lots of error handling •  Message Passing in the Core –  RabbitMQ is a messaging system… •  Light-weight process model –  Scalabiliy
  • 15. Very Basic AMQP •  Queues: Store messages •  Queues might be –  Durable: Survive server restarts –  Exclusive: For one connection –  autoDelete: Deleted if connection closes •  Queue usually created by consumer •  All resources are dynamic •  Producer sends a message to a Queue •  Let’s see some code…
  • 16. Spring’s RabbitTemplate •  Send & receive message •  AmqpTemplate: Generic AMQP interface •  RabbitOperations: Rabbit specific interface: (adds just a callback) •  RabbitTemplate: Implementation •  Spring might provide support for other AMQP implementations later •  Common interface
  • 17. Spring’s MessageConverter •  Messages are binary data •  RabbitTemplate uses MessageConverter to convert between objects and messages •  Can also send binary data if preferred •  Default: SimpleMessageConverter –  byte[] directly transferred –  String converted with configurable encoding –  Serializable are serialized –  Content type set accordingly •  JsonMessageConverter converts from / to JSON using Jackson •  MarshallingMessageConverter converts from / to XML using Spring's OXM mapping
  • 18. Spring‘s AdminTemplate •  Main purpose: Configure the AMQP infrastructure •  E.g. create queues •  AmpqAdmin: Generic AMQP interface •  RabbitAdmin: Rabbit specific
  • 19. Code ConnectionFactory conFactory = new SingleConnectionFactory("localhost"); RabbitTemplate template = new RabbitTemplate(conFactory); RabbitAdmin admin = new RabbitAdmin(conFactory); admin.declareQueue(new Queue("myQueue")); template.convertAndSend("myQueue", "Hi AMQP!"); String receive = (String) template.receiveAndConvert("myQueue"); Assert.assertEquals("Hi AMQP!", receive);
  • 20. Basics of AMQP •  Sending messages directly to queues is not enough •  What about e.g. pub / sub? •  Exchange: Route messages (stateless) •  Messages are byte-streams •  Example used the default exchange •  More dynamic, flexible and cleaner than JMS
  • 21. AMQP  in  a  nutshell   Exchange routes message Stateless Usually created by producer No queue: Message discarded X Binding binds an Exchange to a Queue Queues buffer messages Usually created by consumer
  • 22. AMQP  in  a  nutshell   Producer and Consumer might be written in Java, C#, Python, Ruby … C P X C AMQP RabbitMQ AMQP protocol protocol
  • 23. Exchange: Route Messages X •  The type of Exchange defined the routing algorithm used •  Binding provides selector for routing •  Exchange is addressed by name •  Some standard types •  Can provide additional ones
  • 24. Fanout Exchange X •  Broadcast to all bound queues •  Fast •  Simple •  amq.fanout is mandatory •  To broadcast information
  • 25. Fanout Exchange X C P X C Fanout C
  • 26. Queue fanoutQueue = new Queue("fanoutQueue"); admin.declareQueue(fanoutQueue); FanoutExchange fanoutExchange= new FanoutExchange("myFanout"); admin.declareExchange(fanoutExchange); admin.declareBinding( BindingBuilder.from(fanoutQueue). to(fanoutExchange)); template.setExchange("myFanout"); template.convertAndSend("Hi Fanout!"); String receive = (String) template.receiveAndConvert("fanoutQueue"); Assert.assertEquals("Hi Fanout!", receive);
  • 27. Direct Exchange X •  Routing based on one routing key •  amq.direct and the default Exchange (no name) always exist •  To send work orders to a specific worker
  • 28. Direct Exchange normal express Direct Exchange C express P X C normal C
  • 29. Queue directQueue = new Queue("direct"); admin.declareQueue(directQueue); admin.declareBinding(BindingBuilder .from(directQueue) .to(new DirectExchange("amq.direct")) .with("helloKey")); template.setExchange("amq.direct"); template.convertAndSend("amq.direct","dropMe", "I will be dropped!"); template.convertAndSend("amq.direct","helloKey", "Hi Direct!"); Assert.assertEquals("Hi Direct!", template.receiveAndConvert("direct")); Assert.assertNull( template.receiveAndConvert("direct"));
  • 30. Topic Exchange X •  Routing based on routing pattern •  amq.topic is mandatory •  E.g. for public / subscribe scenarios
  • 31. Topic Exchange   order.DE invoice.USD Topic Exchange order.* P X C invoice.* C
  • 32. Headers Exchange X •  Routing based on one or more headers and an expression •  amqp.match is mandatory •  Complex routing roles
  • 33. Other Features •  Message can be persistent •  Request / response using correlations possible •  Redelivery / acknowledgement possible •  Clustering with e.g. Linux HA possible •  ...or send message through multiple channels and drop duplicates
  • 35. Configuring Rabbit Resources with Spring •  Spring enables decoupling of your application code from the underlying infrastructure •  The container provides the resources •  The application is simply coded against the API
  • 36. Configuring a ConnectionFactory <bean id="connectionFactory" class="org.sfw.amqp.rabbit.connection.SingleConnectionFactory"> <property name="username" value="guest"/> <property name="password" value="guest"/> <constructor-arg value="localhost" /> </bean> •  Can easily modify configuration options
  • 37. Defining a RabbitTemplate Bean •  Provide a reference to the ConnectionFactory •  Optionally provide other references –  MessageConverter –  Routing key and exchange to be used if none is specified <bean id="rabbitTemplate" class="org.springframework.amqp.rabbit.core.RabbitTemplate"> <constructor-arg ref="connectionFactory" /> <property name="routingKey" value=”invoice.USD" /> </bean>
  • 38. The MessageListener •  So far: Calling receive() on RabbitTemplate •  Needed: Something that is called when a new message appears •  The API defines this interface for asynchronous reception of messages public void onMessage(Message) { // handle the message }
  • 39. Spring’s MessageListener Container •  Spring provides lightweight containers to call MessageListeners •  SimpleMessageListenerContainer •  Advanced scheduling and endpoint management options available •  i.e. thread pools, concurrent consumers, transaction handling
  • 40. Defining a Message Listener Container <bean class="org.sfw.amqp.rabbit.listener.SimpleMessageListenerContainer"> <property name="connectionFactory" ref="connectionFactory" /> <property name="queueNames" value="my.amqp.queue" /> <property name="messageListener" ref="messageListener" /> </bean> •  Every time a new message appears on my.amqp.queue the messageListener is called
  • 41. Spring's message-driven objects •  MessageListener means the receiver depends on Spring API •  Why not just a POJO? •  MessageListenerAdapter takes a POJO and makes it a MessageListener •  i.e. calls consume on Bean consumer <bean id="messageListenerAdapter" class="org.sfw.amqp.rabbit.listener.adapter.MessageListenerAdapter"> <property name="delegate" ref="consumer" /> <property name="defaultListenerMethod" value="consume" /> <property name="messageConverter" ref="jsonMessageConverter" /> </bean>
  • 42. Easier Using Namespaces <rabbit:listener-container connection-factory="connectionFactory“ message-converter="jsonMessageConverter"> <rabbit:listener ref="consumer" method="consume" queue-names="my.amqp.queue2" /> </rabbit:listener-container> •  Results in the same Spring Beans
  • 43. Consumer code @Component public class Consumer { public String consume(String message) { return …; } } •  No dependency on AMQP! •  But: What about the result of the method? •  Send to the Reply-To address given in message properties with same correlationId as original method
  • 44. Client Code String response = (String) rabbitOperations.convertSendAndReceive( "my.fanout", "", "test"); •  Message sent to destination with routing key •  Reply-To set to exclusive, autodelete, non- durable queue •  Response received through Reply-To converted and returned •  Easy request-response! •  Beware of potential latency
  • 45. Create Environment Using Namespaces <rabbit:fanout-exchange name="my.fanout2"> <rabbit:bindings> <rabbit:binding queue="my.amqp.queue2" /> </rabbit:bindings> </rabbit:fanout-exchange> <rabbit:queue name="my.amqp.queue2" /> •  ...if you don‘t like API calls
  • 46. Conclusion: AMQP •  Ubiquitous Messaging •  AMQP: Protocol standard •  Better scalability •  Dynamic resources
  • 47. Conclusion: Spring AMQP •  Easy to use •  Flexible (e.g. message encoding) •  Allows scalable message handling •  Full support for AMQP and RabbitMQ
  • 48. More •  http://springsource.org/spring-amqp •  Also a .NET version available •  …and support Spring Integration •  http://blog.springsource.com/2011/04/01/ routing-topologies-for-performance-and- scalability-with-rabbitm •  Transaction support •  …and there is very similar JMS support 