SlideShare ist ein Scribd-Unternehmen logo
1 von 78
Downloaden Sie, um offline zu lesen
What’s Messaging?
An Introduction
History of Message Queuing
Manual Telegraphy Machine Assisted Telegraphy
1920s1911 - 192019th Century 1900s
Telegrams sent using
“Store and Forward”
1900
1930s
History of Message Queuing
Electronic Telegraphy
1950s1940s1950s1940s
Electronic Telegram
Machines, eg Plan 55-A
1948
IBM
M
ne Assisted Telegraphy
1920s1920 1930s
History of Message Queuing
Telcos UseElectronic Telegraphy
1950s1940s 1960s
IBM System/360 with
BTAM & QTAM
Message Switching
1964
First Electronic Mail
Solutions
1965
Banking Users
1970s
IBM TCAM which is
the ïŹrst true solution
Retired 1990!
1971
History of Message Queuing
l
Financial Trading UsersBanking Users FMCG & Utilities
1980s 1990s
Growth of SMTP
Origins of Tibco in
Stock Price Messaging
1980s
IBM Launch MQSeries
(now WebsphereMQ)
1992
1970s
IBM TCAM which is
the ïŹrst true solution
Retired 1990!
1971
History of Message Queuing
l
FMCG & Utilities
1990s
MQSeries
phereMQ)
92
Corporates Large Websites YOU
Noughties Today
Sun Release Java JMS,
Reinvigorating
Enterprise Messaging
2001
AMQP Working
Group Formed by
Investment Banks
2006
Cloud Enables and
Drives StormMQ
Adoption
2009
The Integration Tag Soup
WS –File Transfer
!"#$%&'(#)#*#+%+
Message Queuing
SOAP
EMail
SMTP
FTP
RSYNC
NTFS
!','-
!).$%&'/$.0%&1$%+
234%5)6!%$7%$
SOA
Message
Orientated
Middleware
JMS
MQ
MQSeries
AMQP
Amazon SQS
Tibco
StormMQ
RabbitMQ
HTTP
TCP/IP
DCE / RPC
CORBA
DCOM
REST
RMI
XML-RPC
.NET Remoting
Remote Procedure Call
The Integration Tag Soup
WS –File Transfer
!"#$%&'(#)#*#+%+
Message Queuing
SOAP
EMail
SMTP
FTP
RSYNC
NTFS
!','-
!).$%&'/$.0%&1$%+
234%5)6!%$7%$
SOA
Message
Orientated
Middleware
JMS
MQ
MQSeries
AMQP
Amazon SQS
Tibco
StormMQ
RabbitMQ
HTTP
TCP/IP
DCE / RPC
CORBA
DCOM
REST
RMI
XML-RPC
.NET Remoting
Remote Procedure Call
Under Examination, though
File Transfer
!"#$%&'(#)#*#+%+
Remote Procedure Call
Don’tWork in the Cloud
Under Examination, though
Deployment
Intimate System Knowledge
ConïŹguration
Admin
File Transfer
!"#$%&'(#)#*#+%+
Remote Procedure Call
Don’tWork in the Cloud
Scaling
Ideal: Message Queuing
Systems are “loosely-coupled”
Message
Queuing
Ideal: Message Queuing
Systems are “loosely-coupled”
Message
Queuing
Ideal: Message Queuing
Systems are “loosely-coupled”
Message
Queuing
Systems don’t
know each other
Why Use it: Loose Coupling
Billing
Catalogue
Shipping
S-a-a-S Inventory
How do we connect them, without one outage or system
change taking everything down like a pack of cards?
Why Use it: Loose Coupling
Billing
Catalogue
Shipping
S-a-a-S Inventory
How do we connect them, without one outage or system
change taking everything down like a pack of cards?
Message Queuing lets Systems and Components exchange
data, events, commands and actions with one another
with no explicit knowledge or need for them to be online
It should be ideal for the cloud
It should be ideal for the cloud
!
!
!
Until today, messaging is 

(ZeroMQ)
(SQS uses HTTP)
(MSMQ uses COM)
(memcached)
(Java JMS
uses
Source)
(MQSeries / WebsphereMQ)
(Talarian, Rendezvous, etc)
Platform Restricted BespokeProprietary
!
!
!
Until today, messaging is 

(ZeroMQ)
(SQS uses HTTP)
(MSMQ uses COM)
(memcached)
(Java JMS
uses
Source)
(MQSeries / WebsphereMQ)
(Talarian, Rendezvous, etc)
Why is it Hell?
You need more staff And moneyYou need bridge technology
Why is it Hell?
You need more staff And moneyYou need bridge technology
However, there’s a solution
A-MQPAdvanced Message Queue Protocol
However, there’s a solution
However, AMQP ïŹxes this
A common wire-level binary
format and protocol
An explicit deïŹnition of a
server (aka broker)’s
semantics
Open Means
Interoperable
That is good 

“AMQP will be to Messaging what HTTP was to theWeb”
MRG
Clients run on any Platform Vendors are Interoperable
That is good 

“AMQP will be to Messaging what HTTP was to theWeb”
MRG
Clients run on any Platform Vendors are Interoperable
64K
From Anywhere to Anywhere
From Anywhere to Anywhere
From Anywhere to Anywhere
From Anywhere to Anywhere
From Anywhere to Anywhere
Quick Recap
For Beer
The ïŹfth male member
of the A-Team, Frankie,
was played by
Question
Message Queuing connects systems and
components. Is it ideal for the cloud?
Does Loose-Coupling make individual
systems more likely to suffer outages?
Yes No
AMQP is Open.
This makes it suitable for programming
in C and Javascript?
EddieVelez
Quick Recap
✓
The ïŹfth male member
of the A-Team, Frankie,
was played by
Question
Message Queuing connects systems and
components. Is it ideal for the cloud?
Does Loose-Coupling make individual
systems more likely to suffer outages?
Yes No
AMQP is Open.
This makes it suitable for programming
in C and Javascript?
!
✓
Common Terms and Jargon
Jargon
Messaging: Which Jargon?
EMail
(SMTP, POP3, IMAP)
VoIP
(VoiceMail, XMPP)
Texting
(SMS)
Instant Messaging
(ICQ, MSN, Jabber)
Twitter
Enterprise Service Bus
(ESB)
Dynamic OO
Languages
(eg Ruby)
Message Queuing
(MQ)
Message Queuing
(MQ)
What do we
mean by
Messaging?
Essential Terms
Message Queue
Behaves like a Queue
Is First-In First-Put (FIFO)
Elements are Messages
Essential Terms
Message Queue What’s a Message?
Envelope
Payload
Header
Essential Terms
*Strictly speaking
a receiver polls for messages
a consumer has messages pushed
≣ ≊Send Publish Enqueue
≣ ≊ DequeueConsume*Receive
So how can you use it?
Concepts
Useful Book:
Enterprise
Integration Patterns
Hohpe &Woolf
Store and Forward
Billing
“Could you send me a duplicate of my bill please”
REST
Store and Forward
Billing
“Could you send me a duplicate of my bill please”
REST
!
Store and Forward
Billing
“Could you send me a duplicate of my bill please”
REST
StormMQ
Messaging
Billing
!
Store and Forward
Billing
“Could you send me a duplicate of my bill please”
REST
StormMQ
Messaging
Billing
!
!
Store and Forward
Billing
“Could you send me a duplicate of my bill please”
REST
StormMQ
Messaging
Billing
!
Fire and Forget
Shipping
“Too many orders.The website is running like a dog.”
SQL Push SQL Pull
Fire and Forget
Shipping
“Too many orders.The website is running like a dog.”
SQL Push SQL Pull
StormMQ
Messaging
Shipping
One-To-Many
“There’s a new widget in the Catalogue: Tell all the systems.”
Catalogue
Shipping
S-a-a-S Inventory
File Transfer
ETL
One-To-Many
“There’s a new widget in the Catalogue: Tell all the systems.”
Catalogue
Shipping
S-a-a-S Inventory
StormMQ
Messaging
Publish-Subscribe (“Topics”)
“Shipments Sent, Delivered and Returned”
Shipping
S-a-a-S Inventory
Billing
AnySent
Sent or
Returned
StormMQ
Messaging
Publish-Subscribe (“Topics”)
“Shipments Sent, Delivered and Returned”
Shipping
S-a-a-S Inventory
Billing
AnySent
Sent or
Returned
Round-Robin
Billing
“How do we easily scale a massive batch job like Billing?”
EMail BillGenerate
StormMQ
Messaging
Round-Robin
Billing
“How do we easily scale a massive batch job like Billing?”
EMail BillGenerate
Getting Technical
Delving into AMQP
AMQP Client AMQP ServerTCP / IP Network
Connection Virtual Host
Connections and Channels
Connection
AMQP Client AMQP ServerTCP / IP Network
Connection
Virtual Host
Connections and Channels
TLS
“Shielding”
Channels
Each Channel is Independent:
Effectively, aVirtual Connection
Basic AMQP: Connections
Basic AMQP: Connections
Open a Connection to aVirtual Host
Open a Channel
Send a Message
Receive a Message
Close Channel
Close Connection
You only need one channel!
"
#
$
%
&
'
How does
this look
in Code?
// The API is styled similarly to Functionally Orientated Programming (FOP)
// It makes extensive use of Constructor Injection and anonymous classes modelling 'blocks'
// Closes are handled implicitly by design with exceptions thrown, ie try-ïŹnally is internal to the API
public void demonstrateConnection()
{
ïŹnal AmqpConnectionFactory amqpConnectionFactory =
amqpConnectionFactoryWhichVeriïŹesStormMQ(“mycompany”, “mysystem”, “development”, “user”, “password”);
// Creates and closes a connection
amqpConnectionFactory . useConnection
(
// Creates and closes a channel on a connection
new ChannelCreatingConnectionUser
(
// Adapts a channel to make it convenient to use
new ConvenientChannelCreatingConnectionUser
(
new ConvenientChannelUser()
(
public void use(ïŹnal @NotNull ConvenientChannel convenientChannel)
{
// Send a message, or,
// Receive a message (or both)
}
);
)
)
)
}
// Sending a Message
public void use(ïŹnal @NotNull ConvenientChannel convenientChannel)
{
// ConvenientChannel has static convenience methods to create messageHeaders (meta-data)
// Use them to signify a message's content’s MIME type or an unique id
// Use meta data sparingly; think of it like email headers. More later
ïŹnal BasicProperties messageHeaders = emptyBasicProperties();
// All messages are byte arrays
ïŹnal byte[] messageBody = "HelloWorld" . getBytes( forName("UTF-8") );
// Send the message
ïŹnal String routingKey = "usually the destination message queue";
ïŹnal boolean mandatory = false;
ïŹnal boolean immediate = false;
convenientChannel . basicPublish( "", routingKey, mandatory, immediate, messageHeaders, messageBody );
}
/* Notes
* Mandatory (mandatory = true) messages are returned unless routed to a queue
* Immediate (mandatory = true) messages are returned unless there is another channel consuming
*/
// Receiving a Message using Polling
public void use(ïŹnal @NotNull ConvenientChannel convenientChannel)
{
ïŹnal boolean noAck = false;
convenientChannel . basicGet( "queue", noAck, DoNothingWhenMessageNotReceived, new MessageReceived()
{
public void messageReceived(ïŹnal @NotNull GetResponse message)
{
ïŹnal byte[] messageBody = message . getBody();
ïŹnal BasicProperties messageHeaders = message . getProps();
// Acknowledge successfully received messages if noAck = false
// If not acknowledged, they are eventually placed back on the queue for re-delivery
convenientChannel . basicAck( message );
}
});
}
/* Notes
* DoNothingWhenMessageNotReceived is a singleton of MesageNotReceived
* Implement DoNothing to do something else, eg for debugging
* Polling is thread-safe but inefïŹcient; using consumers (“push”) for more efïŹciency

*/
// Consuming Messages using Push
public void use(ïŹnal @NotNull ConvenientChannel convenientChannel)
{
ïŹnal boolean noAck = true;
convenientChannel . basicConsume( "my queue", noAck, new ConvenientConsumer()
{
// Consumers run on a different thread
public void handleDelivery( ïŹnal String consumerTag, ïŹnal Envelope envelope, ïŹnal BasicProperties
messageHeaders, ïŹnal byte[] messageBody )
{
ïŹnal byte[] messageBody = message . getBody();
ïŹnal BasicProperties messageHeaders = message . getProps();
// No need to acknowledge message as noAck = true
}
});
}
/* Notes
* Consumers only exist as long as a channel is open
* Add a threading primitive (eg volatile boolean) and reference it at *
* It is possible to use multiple channels with several consumers

*/
*
!
✓
Channels
Complex Applications
Consume on several threads
Send on several threads
Why Use More than One Channel?
Recommendation: Keep it Simple!
Simple Applications
Send on a queue
Receive on another
Transactional Applications
NeedTransactions on a queue
Don’t NeedTransactions on another
✓
Exchanges Route Messages
Exchanges route Messages to Message Queues
Exchange
MQ
A
MQ
B
Exchanges Route Messages
Exchanges route Messages to Message Queues
You send messages to an exchange, not a message queue
Exchange
MQ
A
MQ
B
How do Exchanges Route?
Exchange
MQ
A
The Exchange ïŹnds a Binding
matching the Routing Key
#
A Binding connects a Routing Key
to one or more Message Queues
$
Every sent message has a
Routing Key
"
The Exchange delivers the
Message to the Message Queue
%
A message queue can be
bound more than once to
one or more exchanges
(
“string”
Types of Exchange
More rarely used exchange types include amq.headers and extensions
Message Queue Name
direct
Like a ‘Map’:All MQs
bound with the
routing key receive
copies of the message
“” (blank)
amq.direct
fanout
Empty String
All MQs bound to the
Exchange receive
copies of the message
amq.fanout
topic
Dotted
Bindings use
globbing expressions
(wildcards) to route
messages to MQs
amq.topic
A message queue can be bound more than once to an exchange;
A message queue can be bound to more than one exchange
But a message queue will only receive a message sent once
Routing Key
Routing
Behaviour
Default
DeïŹnitions
Point – to – Point One – to – Many Publish – SubscribeTypical Use
// Declaring Exchanges
public void use(ïŹnal @NotNull ConvenientChannel convenientChannel)
{
ïŹnal boolean passivelyDeclare = false;
ïŹnal boolean durable = true;
ïŹnal boolean autoDelete = false;
// Just change the ExchangeType to one of direct, fanout or topic
convenientChannel . exchangeDeclare( "my exchange A", direct, passivelyDeclare, durable, autoDelete );
convenientChannel . exchangeDeclare( "my exchange B", fanout, passivelyDeclare, durable, autoDelete );
convenientChannel . exchangeDeclare( "my exchange C", topic, passivelyDeclare, durable, autoDelete );
// A passive declaration asserts that an exchange exists, causing a channel exception if it does not
convenientChannel . exchangeDeclare( "my exchange A", direct, true, durable, autoDelete );
}
/* Notes
* Always use durable = true with StormMQ as we are a hosted service
* Nearly always use autoDelete = false as exchanges should be long-lived
* Declaring an exchange twice is not an error; if parameters differ, new values are used if possible
* Passive declaration is interesting but typical deployment practices mitigate its usefulness
*/
// Declaring and Binding Message Queues
public void use(ïŹnal @NotNull ConvenientChannel convenientChannel)
{
ïŹnal boolean passivelyDeclare = false;
ïŹnal boolean durable = true;
ïŹnal boolean autoDelete = false;
ïŹnal boolean exclusive = false;
// A declared queue is bound to the default ("") exchange with the routing key the queue name ("my queue")
convenientChannel . queueDeclare( "my queue", passivelyDeclare, durable, exclusive, autoDelete );
// A message queue can be bound to another exchange with whatever key you choose
convenientChannel . queueBind( "my queue", "another exchange", "some routing key" );
// When binding to a fanout exchange the routing key is the empty string ("")
convenientChannel . queueBind( "my queue", "a fanout exchange, eg amq.fanout", "" );
// When binding to a topic exchange, set the routing key as a wildcard
// Publish messages with speciïŹc routing keys eg "BONDS.USD.FTSE", "BONDS.USD.NYSE", "BONDS.GBP.FTSE"
convenientChannel . queueBind( "my queue", "a fanout exchange, eg amq.topic", "BONDS.USD.*" );
}
/* Notes
* Always use durable = true with StormMQ as we are a hosted service
* Nearly always use autoDelete = false as message queues should be long-lived
* Declaring a message queue twice is not an error; if parameters differ, new values are used if possible
* Exclusive message queues are for advanced usages and often aren’t needed
*/
AMQP: Introducing Users
but
StormMQ enforces that the same
Users and Permissions are in
all of a System’s Environments
Passwords are different
Passwords are securely generated
by StormMQ and are 512 bit keys
ConïŹguration Managers can prevent
revelation of passwords to different
system users, eg developers vs sysadmins
Aim: Separation of Environments
A Connection can use several
authentication mechanisms
which are perVirtual Host
but
Commonest is User - Password
andand
Aim: Separation of Responsibility
Users are intended to be system
accounts (robots), not sysadmins
Users have read, write and create
permissions using a wildcard syntax:
important to name queues, etc well
// Example of create-system.json used with API call stormmq-create-system
{
"companyName" : "usuallyYourUserName",
"systemName" : "anythingAlphabetic",
"environments" :
[{
"environmentName" : "development",
// Different StormMQ clusters have different characteristics (and costs)
"clusterName" : "free-1",
// These are the StormMQ user accounts to which passwords for AMQP users (below) can be revealed for
this environment (development)
"permittedStormMQUserNames" : [ "developerPeter", "developerJames", "developerJohn" ]
}],
// User permissions operate on Message Queues and Exchanges
"amqpUserPermissions" :
{
"queueReader" : { "create" : "^$", "read" : ".*", "write" : "^$" },
"queueWriter" : { "create" : "^$", "read" : "^$", "write" : ".*" },
"queueCreator" : { "create" : ".*", "read" : "^$", "write" : "^$" },
"onlyProcessingObjects" : { "create" : "^processing.*", "read" : "^processing.*", "write" : "^processing.*" }
}
}
ConïŹguring AMQP
“*Our REST API has Java, Ruby, PHP and .NET bindings”
AMQP StormMQ
✓ ActiveMessage Queues
Exchanges
Bindings
Users
User Permissions
Entire Systems
! Extra
! Extra
! Extra
✓ Active
✓ Active
✓ REST
✓ REST
✓ REST*
Programmatic ConïŹg
✓ Same
✓ Same
✓ Same
AMQP: Getting Statistics
“*Password revelation is restricted to speciïŹc individuals”
AMQP StormMQ
Message Queues
Exchanges
Bindings
Generated Passwords
Usage Patterns
Entire Systems
! Extra
! Extra
! Extra
✓ REST
✓ REST
✓ REST
Programmatic Info
! Extra ✓ REST
! Extra ✓ REST*
! Extra ✓ REST
// Getting Statistics from StormMQ using the REST API in Java
// If you need to use proxies or experience the pain of Java SSL choose a different method in ApiConïŹguration
ïŹnal ApiConïŹguration apiConïŹguration = directConnectionIfHavingProblemsWithSslVeriïŹcation();
// If your Magic Secret Key is in an unusual place choose a different method in Api
ïŹnal Api api = apiByGuessingUsingOsConïŹgurationFiles( apiConïŹguration, stormMqUserName );
ïŹnal List<AmqpQueue> amqpQueues = api . listQueues( companyName, systemName, environmentName );
ïŹnal List<AmqpExchange> amqpExchanges = api . listExchanges( companyName, systemName, environmentName );
ïŹnal List<AmqpBinding> amqpBindings = api . listBindings( companyName, systemName, environmentName );
ïŹnal Map<AmqpUserName, AmqpUserPassword> passwords =
api . listAmqpUserNamesAndPasswords( companyName, systemName, environmentName );
ïŹnal CompanyDetails companyDetails = api . describeCompany( companyName );
// Finding “what we’ve got”
ïŹnal List<CompanyName> companyNames = api . listCompanies();
ïŹnal List<ClusterName> clusterNames = api . listClusters( companyName );
ïŹnal List<SystemName> systemNames = api . listSystems( companyName );
ïŹnal SystemDetails systemDetails = api . describeSystem( companyName, systemName );
ïŹnal Set<Environment> environments = systemDetails . getEnvironments();
/* Notes
* Also consider the command-line tools stormmq-list-queues, stormmq-list-exchanges and stormmq-list-bindings
* Further examples are in com.stormmq.api.Example (part of the url signer jar)
*/
Virtual Hosts
Virtual Hosts: Think Apache!
Virtual Hosts isolate Message Queues
Virtual Hosts isolate User Groups*
Virtual Hosts isolate Exchanges*
Virtual Hosts isolate Bindings*
Virtual Hosts isolate
Virtual Hosts: StormMQ
Virtual Hosts isolateYour Company
Virtual Hosts isolateYour Systems
Virtual Hosts isolateYour Environments
Enable ConïŹguration Management
Virtual Hosts stop Data Accidents
Widgets Ltd /
Invoicing System /
/
Testing
Development
Production
Message Properties
Server Understood Good Practice
“This is just the tip of messaging best practice with AMQP”
Persistent = 1
Priority = 0
Timestamp = 4568965345
MessageId = 567A-GH-20100709
Priority Queues are per-Message
Control life of a Message
Persistence is per-Message
Timestamps expire Messages
Completely Optional
MIME Content-Type
Unique MessageId
Schema &Version
// Message Properties: Examples of Good Practice
// Being explicit is good practice
ïŹnal BasicProperties messageHeaders = new BasicProperties();
{{
DeliveryMode . NonPersistent . setOn( this );
Priority . Zero . setOn( this );
setMessageId( "My unique ID, eg a GUID or ascending value" );
// Explicit MIME type including charset; use application/octect-stream for trully binary data
setContentType("application/json; charset=utf-8");
// Use compression for larger textual data; use the same values as HTTP headers; use "identity" for none
setContentEncoding( "gzip" );
// Timestamp each message
setTimestamp( new Date( System . currentTimeMillis() ) );
// Schema and version, perhaps using a XML namespace deïŹnition
setType( "syslog-message_1.0.4" );
// Optional: Use an expiration to discard old messages that are stale (milliseconds, example is 5 minutes)
setExpiration( Integer . toString( 5 * 60 * 1000) );
// Optional: Identify the sender for later debugging
setAppId( "sending application name" );
setUserId( "role of sender, or, user of machine" );
// Optional: Identify domain or environment (consumer could error if working in different one)
setClusterId( "production" );
}};
And there is more!
Transactions
More Message
Properties
Custom Message
Properties
Immediate Delivery
Additional Exchange
Types
Auto Deletion
Fine-Grained User
Permissions
Queue
Purging
QoS
Useful Book:
Enterprise
Integration Patterns
Hohpe &Woolf

Weitere Àhnliche Inhalte

Was ist angesagt?

Messaging with RabbitMQ and AMQP
Messaging with RabbitMQ and AMQPMessaging with RabbitMQ and AMQP
Messaging with RabbitMQ and AMQPEberhard Wolff
 
Rabbit MQ introduction
Rabbit MQ introductionRabbit MQ introduction
Rabbit MQ introductionShirish Bari
 
Rabbitmq an amqp message broker
Rabbitmq an amqp message brokerRabbitmq an amqp message broker
Rabbitmq an amqp message brokerANASYS
 
Messaging in the Cloud - AMQP, RabbitMQ and Spring
Messaging in the Cloud - AMQP, RabbitMQ and SpringMessaging in the Cloud - AMQP, RabbitMQ and Spring
Messaging in the Cloud - AMQP, RabbitMQ and SpringEberhard Wolff
 
High powered messaging with RabbitMQ
High powered messaging with RabbitMQHigh powered messaging with RabbitMQ
High powered messaging with RabbitMQJames Carr
 
Introduction To RabbitMQ
Introduction To RabbitMQIntroduction To RabbitMQ
Introduction To RabbitMQKnoldus Inc.
 
RabbitMq
RabbitMqRabbitMq
RabbitMqAhmad Saif
 
Introduction to AMQP Messaging with RabbitMQ
Introduction to AMQP Messaging with RabbitMQIntroduction to AMQP Messaging with RabbitMQ
Introduction to AMQP Messaging with RabbitMQDmitriy Samovskiy
 
Architecture | The Future of Messaging: RabbitMQ and AMQP | Eberhard Wolff
Architecture | The Future of Messaging: RabbitMQ and AMQP | Eberhard WolffArchitecture | The Future of Messaging: RabbitMQ and AMQP | Eberhard Wolff
Architecture | The Future of Messaging: RabbitMQ and AMQP | Eberhard WolffJAX London
 
RabbitMQ fairly-indepth
RabbitMQ fairly-indepthRabbitMQ fairly-indepth
RabbitMQ fairly-indepthWee Keat Chin
 
RabbitMQ vs Apache Kafka Part II Webinar
RabbitMQ vs Apache Kafka Part II WebinarRabbitMQ vs Apache Kafka Part II Webinar
RabbitMQ vs Apache Kafka Part II WebinarErlang Solutions
 
Rabbitmq basics
Rabbitmq basicsRabbitmq basics
Rabbitmq basicsAbdriy Mosin
 
Easy enterprise application integration with RabbitMQ and AMQP
Easy enterprise application integration with RabbitMQ and AMQPEasy enterprise application integration with RabbitMQ and AMQP
Easy enterprise application integration with RabbitMQ and AMQPRabbit MQ
 
[@NaukriEngineering] Messaging Queues
[@NaukriEngineering] Messaging Queues[@NaukriEngineering] Messaging Queues
[@NaukriEngineering] Messaging QueuesNaukri.com
 
Rabbitmq & Kafka Presentation
Rabbitmq & Kafka PresentationRabbitmq & Kafka Presentation
Rabbitmq & Kafka PresentationEmre GĂŒndoğdu
 
The RabbitMQ Message Broker
The RabbitMQ Message BrokerThe RabbitMQ Message Broker
The RabbitMQ Message BrokerMartin Toshev
 
Queues queues queues — How RabbitMQ enables reactive architectures
Queues queues queues — How RabbitMQ enables reactive architecturesQueues queues queues — How RabbitMQ enables reactive architectures
Queues queues queues — How RabbitMQ enables reactive architecturesMartin Tajur
 
Full Stack Bus with Javascript, RabbitMQ and Postal.js
Full Stack Bus with Javascript, RabbitMQ and Postal.jsFull Stack Bus with Javascript, RabbitMQ and Postal.js
Full Stack Bus with Javascript, RabbitMQ and Postal.jsJavier Arias Losada
 
RabbitMQ with python and ruby RuPy 2009
RabbitMQ with python and ruby RuPy 2009RabbitMQ with python and ruby RuPy 2009
RabbitMQ with python and ruby RuPy 2009Paolo Negri
 

Was ist angesagt? (20)

Messaging with RabbitMQ and AMQP
Messaging with RabbitMQ and AMQPMessaging with RabbitMQ and AMQP
Messaging with RabbitMQ and AMQP
 
Rabbit MQ introduction
Rabbit MQ introductionRabbit MQ introduction
Rabbit MQ introduction
 
Rabbitmq an amqp message broker
Rabbitmq an amqp message brokerRabbitmq an amqp message broker
Rabbitmq an amqp message broker
 
Messaging in the Cloud - AMQP, RabbitMQ and Spring
Messaging in the Cloud - AMQP, RabbitMQ and SpringMessaging in the Cloud - AMQP, RabbitMQ and Spring
Messaging in the Cloud - AMQP, RabbitMQ and Spring
 
High powered messaging with RabbitMQ
High powered messaging with RabbitMQHigh powered messaging with RabbitMQ
High powered messaging with RabbitMQ
 
Introduction To RabbitMQ
Introduction To RabbitMQIntroduction To RabbitMQ
Introduction To RabbitMQ
 
RabbitMq
RabbitMqRabbitMq
RabbitMq
 
Introduction to AMQP Messaging with RabbitMQ
Introduction to AMQP Messaging with RabbitMQIntroduction to AMQP Messaging with RabbitMQ
Introduction to AMQP Messaging with RabbitMQ
 
Amqp Basic
Amqp BasicAmqp Basic
Amqp Basic
 
Architecture | The Future of Messaging: RabbitMQ and AMQP | Eberhard Wolff
Architecture | The Future of Messaging: RabbitMQ and AMQP | Eberhard WolffArchitecture | The Future of Messaging: RabbitMQ and AMQP | Eberhard Wolff
Architecture | The Future of Messaging: RabbitMQ and AMQP | Eberhard Wolff
 
RabbitMQ fairly-indepth
RabbitMQ fairly-indepthRabbitMQ fairly-indepth
RabbitMQ fairly-indepth
 
RabbitMQ vs Apache Kafka Part II Webinar
RabbitMQ vs Apache Kafka Part II WebinarRabbitMQ vs Apache Kafka Part II Webinar
RabbitMQ vs Apache Kafka Part II Webinar
 
Rabbitmq basics
Rabbitmq basicsRabbitmq basics
Rabbitmq basics
 
Easy enterprise application integration with RabbitMQ and AMQP
Easy enterprise application integration with RabbitMQ and AMQPEasy enterprise application integration with RabbitMQ and AMQP
Easy enterprise application integration with RabbitMQ and AMQP
 
[@NaukriEngineering] Messaging Queues
[@NaukriEngineering] Messaging Queues[@NaukriEngineering] Messaging Queues
[@NaukriEngineering] Messaging Queues
 
Rabbitmq & Kafka Presentation
Rabbitmq & Kafka PresentationRabbitmq & Kafka Presentation
Rabbitmq & Kafka Presentation
 
The RabbitMQ Message Broker
The RabbitMQ Message BrokerThe RabbitMQ Message Broker
The RabbitMQ Message Broker
 
Queues queues queues — How RabbitMQ enables reactive architectures
Queues queues queues — How RabbitMQ enables reactive architecturesQueues queues queues — How RabbitMQ enables reactive architectures
Queues queues queues — How RabbitMQ enables reactive architectures
 
Full Stack Bus with Javascript, RabbitMQ and Postal.js
Full Stack Bus with Javascript, RabbitMQ and Postal.jsFull Stack Bus with Javascript, RabbitMQ and Postal.js
Full Stack Bus with Javascript, RabbitMQ and Postal.js
 
RabbitMQ with python and ruby RuPy 2009
RabbitMQ with python and ruby RuPy 2009RabbitMQ with python and ruby RuPy 2009
RabbitMQ with python and ruby RuPy 2009
 

Ähnlich wie An Introduction to AMQP with Code Samples

[OSC2016] ăƒžă‚€ă‚Żăƒ­ă‚”ăƒŒăƒ“ă‚čă‚’æ”Żăˆă‚‹ MQ ă‚’è€ƒăˆă‚‹
[OSC2016] ăƒžă‚€ă‚Żăƒ­ă‚”ăƒŒăƒ“ă‚čă‚’æ”Żăˆă‚‹ MQ ă‚’è€ƒăˆă‚‹[OSC2016] ăƒžă‚€ă‚Żăƒ­ă‚”ăƒŒăƒ“ă‚čă‚’æ”Żăˆă‚‹ MQ ă‚’è€ƒăˆă‚‹
[OSC2016] ăƒžă‚€ă‚Żăƒ­ă‚”ăƒŒăƒ“ă‚čă‚’æ”Żăˆă‚‹ MQ ă‚’è€ƒăˆă‚‹Ohyama Hiroyasu
 
The Art of Message Queues - TEKX
The Art of Message Queues - TEKXThe Art of Message Queues - TEKX
The Art of Message Queues - TEKXMike Willbanks
 
REST APIs and MQ
REST APIs and MQREST APIs and MQ
REST APIs and MQMatt Leming
 
Streamsheets and Apache Kafka – Interactively build real-time Dashboards and ...
Streamsheets and Apache Kafka – Interactively build real-time Dashboards and ...Streamsheets and Apache Kafka – Interactively build real-time Dashboards and ...
Streamsheets and Apache Kafka – Interactively build real-time Dashboards and ...confluent
 
Js remote conf
Js remote confJs remote conf
Js remote confBart Wood
 
ĐŸĐŸŃŃ‚Ń€ĐŸĐ”ĐœĐžĐ” Ń€Đ°ŃĐżŃ€Đ”ĐŽĐ”Đ»Đ”ĐœĐœĐŸĐč ŃĐžŃŃ‚Đ”ĐŒŃ‹ ŃĐ±ĐŸŃ€Đ° ĐŽĐ°ĐœĐœŃ‹Ń… с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ RabbitMQ, Alvaro Vid...
ĐŸĐŸŃŃ‚Ń€ĐŸĐ”ĐœĐžĐ” Ń€Đ°ŃĐżŃ€Đ”ĐŽĐ”Đ»Đ”ĐœĐœĐŸĐč ŃĐžŃŃ‚Đ”ĐŒŃ‹ ŃĐ±ĐŸŃ€Đ° ĐŽĐ°ĐœĐœŃ‹Ń… с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ RabbitMQ, Alvaro Vid...ĐŸĐŸŃŃ‚Ń€ĐŸĐ”ĐœĐžĐ” Ń€Đ°ŃĐżŃ€Đ”ĐŽĐ”Đ»Đ”ĐœĐœĐŸĐč ŃĐžŃŃ‚Đ”ĐŒŃ‹ ŃĐ±ĐŸŃ€Đ° ĐŽĐ°ĐœĐœŃ‹Ń… с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ RabbitMQ, Alvaro Vid...
ĐŸĐŸŃŃ‚Ń€ĐŸĐ”ĐœĐžĐ” Ń€Đ°ŃĐżŃ€Đ”ĐŽĐ”Đ»Đ”ĐœĐœĐŸĐč ŃĐžŃŃ‚Đ”ĐŒŃ‹ ŃĐ±ĐŸŃ€Đ° ĐŽĐ°ĐœĐœŃ‹Ń… с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ RabbitMQ, Alvaro Vid...Ontico
 
HHM-3540: The IBM MQ Light API: From Developer Laptop to Enterprise Data Cen...
 HHM-3540: The IBM MQ Light API: From Developer Laptop to Enterprise Data Cen... HHM-3540: The IBM MQ Light API: From Developer Laptop to Enterprise Data Cen...
HHM-3540: The IBM MQ Light API: From Developer Laptop to Enterprise Data Cen...Matt Leming
 
Azure Service Bus Performance Checklist
Azure Service Bus Performance ChecklistAzure Service Bus Performance Checklist
Azure Service Bus Performance ChecklistSalim M Bhonhariya
 
Enterprise Messaging with RabbitMQ.pdf
Enterprise Messaging with RabbitMQ.pdfEnterprise Messaging with RabbitMQ.pdf
Enterprise Messaging with RabbitMQ.pdfOrtus Solutions, Corp
 
Software Architectures, Week 4 - Message-based Architectures, Message Bus
Software Architectures, Week 4 - Message-based Architectures, Message BusSoftware Architectures, Week 4 - Message-based Architectures, Message Bus
Software Architectures, Week 4 - Message-based Architectures, Message BusAngelos Kapsimanis
 
Ruby Microservices with RabbitMQ
Ruby Microservices with RabbitMQRuby Microservices with RabbitMQ
Ruby Microservices with RabbitMQZoran Majstorovic
 
Lindsay distributed geventzmq
Lindsay distributed geventzmqLindsay distributed geventzmq
Lindsay distributed geventzmqRobin Xiao
 
Wcf faq
Wcf faqWcf faq
Wcf faqRajoo Jha
 
Microservices Practitioner Summit Jan '15 - Don't Build a Distributed Monolit...
Microservices Practitioner Summit Jan '15 - Don't Build a Distributed Monolit...Microservices Practitioner Summit Jan '15 - Don't Build a Distributed Monolit...
Microservices Practitioner Summit Jan '15 - Don't Build a Distributed Monolit...Ambassador Labs
 
RabbitMQ interview Questions and Answers
RabbitMQ interview Questions and AnswersRabbitMQ interview Questions and Answers
RabbitMQ interview Questions and Answersjeetendra mandal
 
Low latency microservices in java QCon New York 2016
Low latency microservices in java   QCon New York 2016Low latency microservices in java   QCon New York 2016
Low latency microservices in java QCon New York 2016Peter Lawrey
 
ApacheCon NA - Apache Camel K: connect your Knative serverless applications w...
ApacheCon NA - Apache Camel K: connect your Knative serverless applications w...ApacheCon NA - Apache Camel K: connect your Knative serverless applications w...
ApacheCon NA - Apache Camel K: connect your Knative serverless applications w...Nicola Ferraro
 
Down the RabbitMQ Hole
Down the RabbitMQ HoleDown the RabbitMQ Hole
Down the RabbitMQ HoleBizTalk360
 

Ähnlich wie An Introduction to AMQP with Code Samples (20)

[OSC2016] ăƒžă‚€ă‚Żăƒ­ă‚”ăƒŒăƒ“ă‚čă‚’æ”Żăˆă‚‹ MQ ă‚’è€ƒăˆă‚‹
[OSC2016] ăƒžă‚€ă‚Żăƒ­ă‚”ăƒŒăƒ“ă‚čă‚’æ”Żăˆă‚‹ MQ ă‚’è€ƒăˆă‚‹[OSC2016] ăƒžă‚€ă‚Żăƒ­ă‚”ăƒŒăƒ“ă‚čă‚’æ”Żăˆă‚‹ MQ ă‚’è€ƒăˆă‚‹
[OSC2016] ăƒžă‚€ă‚Żăƒ­ă‚”ăƒŒăƒ“ă‚čă‚’æ”Żăˆă‚‹ MQ ă‚’è€ƒăˆă‚‹
 
The Art of Message Queues - TEKX
The Art of Message Queues - TEKXThe Art of Message Queues - TEKX
The Art of Message Queues - TEKX
 
REST APIs and MQ
REST APIs and MQREST APIs and MQ
REST APIs and MQ
 
Surge openstack
Surge openstackSurge openstack
Surge openstack
 
Streamsheets and Apache Kafka – Interactively build real-time Dashboards and ...
Streamsheets and Apache Kafka – Interactively build real-time Dashboards and ...Streamsheets and Apache Kafka – Interactively build real-time Dashboards and ...
Streamsheets and Apache Kafka – Interactively build real-time Dashboards and ...
 
Js remote conf
Js remote confJs remote conf
Js remote conf
 
ĐŸĐŸŃŃ‚Ń€ĐŸĐ”ĐœĐžĐ” Ń€Đ°ŃĐżŃ€Đ”ĐŽĐ”Đ»Đ”ĐœĐœĐŸĐč ŃĐžŃŃ‚Đ”ĐŒŃ‹ ŃĐ±ĐŸŃ€Đ° ĐŽĐ°ĐœĐœŃ‹Ń… с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ RabbitMQ, Alvaro Vid...
ĐŸĐŸŃŃ‚Ń€ĐŸĐ”ĐœĐžĐ” Ń€Đ°ŃĐżŃ€Đ”ĐŽĐ”Đ»Đ”ĐœĐœĐŸĐč ŃĐžŃŃ‚Đ”ĐŒŃ‹ ŃĐ±ĐŸŃ€Đ° ĐŽĐ°ĐœĐœŃ‹Ń… с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ RabbitMQ, Alvaro Vid...ĐŸĐŸŃŃ‚Ń€ĐŸĐ”ĐœĐžĐ” Ń€Đ°ŃĐżŃ€Đ”ĐŽĐ”Đ»Đ”ĐœĐœĐŸĐč ŃĐžŃŃ‚Đ”ĐŒŃ‹ ŃĐ±ĐŸŃ€Đ° ĐŽĐ°ĐœĐœŃ‹Ń… с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ RabbitMQ, Alvaro Vid...
ĐŸĐŸŃŃ‚Ń€ĐŸĐ”ĐœĐžĐ” Ń€Đ°ŃĐżŃ€Đ”ĐŽĐ”Đ»Đ”ĐœĐœĐŸĐč ŃĐžŃŃ‚Đ”ĐŒŃ‹ ŃĐ±ĐŸŃ€Đ° ĐŽĐ°ĐœĐœŃ‹Ń… с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ RabbitMQ, Alvaro Vid...
 
HHM-3540: The IBM MQ Light API: From Developer Laptop to Enterprise Data Cen...
 HHM-3540: The IBM MQ Light API: From Developer Laptop to Enterprise Data Cen... HHM-3540: The IBM MQ Light API: From Developer Laptop to Enterprise Data Cen...
HHM-3540: The IBM MQ Light API: From Developer Laptop to Enterprise Data Cen...
 
Azure Service Bus Performance Checklist
Azure Service Bus Performance ChecklistAzure Service Bus Performance Checklist
Azure Service Bus Performance Checklist
 
Enterprise Messaging with RabbitMQ.pdf
Enterprise Messaging with RabbitMQ.pdfEnterprise Messaging with RabbitMQ.pdf
Enterprise Messaging with RabbitMQ.pdf
 
Software Architectures, Week 4 - Message-based Architectures, Message Bus
Software Architectures, Week 4 - Message-based Architectures, Message BusSoftware Architectures, Week 4 - Message-based Architectures, Message Bus
Software Architectures, Week 4 - Message-based Architectures, Message Bus
 
Ruby Microservices with RabbitMQ
Ruby Microservices with RabbitMQRuby Microservices with RabbitMQ
Ruby Microservices with RabbitMQ
 
Lindsay distributed geventzmq
Lindsay distributed geventzmqLindsay distributed geventzmq
Lindsay distributed geventzmq
 
Wcf faq
Wcf faqWcf faq
Wcf faq
 
Windows Communication Foundation (WCF)
Windows Communication Foundation (WCF)Windows Communication Foundation (WCF)
Windows Communication Foundation (WCF)
 
Microservices Practitioner Summit Jan '15 - Don't Build a Distributed Monolit...
Microservices Practitioner Summit Jan '15 - Don't Build a Distributed Monolit...Microservices Practitioner Summit Jan '15 - Don't Build a Distributed Monolit...
Microservices Practitioner Summit Jan '15 - Don't Build a Distributed Monolit...
 
RabbitMQ interview Questions and Answers
RabbitMQ interview Questions and AnswersRabbitMQ interview Questions and Answers
RabbitMQ interview Questions and Answers
 
Low latency microservices in java QCon New York 2016
Low latency microservices in java   QCon New York 2016Low latency microservices in java   QCon New York 2016
Low latency microservices in java QCon New York 2016
 
ApacheCon NA - Apache Camel K: connect your Knative serverless applications w...
ApacheCon NA - Apache Camel K: connect your Knative serverless applications w...ApacheCon NA - Apache Camel K: connect your Knative serverless applications w...
ApacheCon NA - Apache Camel K: connect your Knative serverless applications w...
 
Down the RabbitMQ Hole
Down the RabbitMQ HoleDown the RabbitMQ Hole
Down the RabbitMQ Hole
 

KĂŒrzlich hochgeladen

A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersThousandEyes
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel AraĂșjo
 

KĂŒrzlich hochgeladen (20)

A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 

An Introduction to AMQP with Code Samples

  • 1.
  • 3. History of Message Queuing Manual Telegraphy Machine Assisted Telegraphy 1920s1911 - 192019th Century 1900s Telegrams sent using “Store and Forward” 1900 1930s
  • 4. History of Message Queuing Electronic Telegraphy 1950s1940s1950s1940s Electronic Telegram Machines, eg Plan 55-A 1948 IBM M ne Assisted Telegraphy 1920s1920 1930s
  • 5. History of Message Queuing Telcos UseElectronic Telegraphy 1950s1940s 1960s IBM System/360 with BTAM & QTAM Message Switching 1964 First Electronic Mail Solutions 1965 Banking Users 1970s IBM TCAM which is the ïŹrst true solution Retired 1990! 1971
  • 6. History of Message Queuing l Financial Trading UsersBanking Users FMCG & Utilities 1980s 1990s Growth of SMTP Origins of Tibco in Stock Price Messaging 1980s IBM Launch MQSeries (now WebsphereMQ) 1992 1970s IBM TCAM which is the ïŹrst true solution Retired 1990! 1971
  • 7. History of Message Queuing l FMCG & Utilities 1990s MQSeries phereMQ) 92 Corporates Large Websites YOU Noughties Today Sun Release Java JMS, Reinvigorating Enterprise Messaging 2001 AMQP Working Group Formed by Investment Banks 2006 Cloud Enables and Drives StormMQ Adoption 2009
  • 8. The Integration Tag Soup WS –File Transfer !"#$%&'(#)#*#+%+ Message Queuing SOAP EMail SMTP FTP RSYNC NTFS !','- !).$%&'/$.0%&1$%+ 234%5)6!%$7%$ SOA Message Orientated Middleware JMS MQ MQSeries AMQP Amazon SQS Tibco StormMQ RabbitMQ HTTP TCP/IP DCE / RPC CORBA DCOM REST RMI XML-RPC .NET Remoting Remote Procedure Call
  • 9. The Integration Tag Soup WS –File Transfer !"#$%&'(#)#*#+%+ Message Queuing SOAP EMail SMTP FTP RSYNC NTFS !','- !).$%&'/$.0%&1$%+ 234%5)6!%$7%$ SOA Message Orientated Middleware JMS MQ MQSeries AMQP Amazon SQS Tibco StormMQ RabbitMQ HTTP TCP/IP DCE / RPC CORBA DCOM REST RMI XML-RPC .NET Remoting Remote Procedure Call
  • 10. Under Examination, though File Transfer !"#$%&'(#)#*#+%+ Remote Procedure Call Don’tWork in the Cloud
  • 11. Under Examination, though Deployment Intimate System Knowledge ConïŹguration Admin File Transfer !"#$%&'(#)#*#+%+ Remote Procedure Call Don’tWork in the Cloud Scaling
  • 12. Ideal: Message Queuing Systems are “loosely-coupled” Message Queuing
  • 13. Ideal: Message Queuing Systems are “loosely-coupled” Message Queuing
  • 14. Ideal: Message Queuing Systems are “loosely-coupled” Message Queuing Systems don’t know each other
  • 15. Why Use it: Loose Coupling Billing Catalogue Shipping S-a-a-S Inventory How do we connect them, without one outage or system change taking everything down like a pack of cards?
  • 16. Why Use it: Loose Coupling Billing Catalogue Shipping S-a-a-S Inventory How do we connect them, without one outage or system change taking everything down like a pack of cards? Message Queuing lets Systems and Components exchange data, events, commands and actions with one another with no explicit knowledge or need for them to be online
  • 17. It should be ideal for the cloud
  • 18. It should be ideal for the cloud
  • 19. ! ! ! Until today, messaging is 
 (ZeroMQ) (SQS uses HTTP) (MSMQ uses COM) (memcached) (Java JMS uses Source) (MQSeries / WebsphereMQ) (Talarian, Rendezvous, etc) Platform Restricted BespokeProprietary
  • 20. ! ! ! Until today, messaging is 
 (ZeroMQ) (SQS uses HTTP) (MSMQ uses COM) (memcached) (Java JMS uses Source) (MQSeries / WebsphereMQ) (Talarian, Rendezvous, etc)
  • 21. Why is it Hell? You need more staff And moneyYou need bridge technology
  • 22. Why is it Hell? You need more staff And moneyYou need bridge technology
  • 24. A-MQPAdvanced Message Queue Protocol However, there’s a solution
  • 25. However, AMQP ïŹxes this A common wire-level binary format and protocol An explicit deïŹnition of a server (aka broker)’s semantics Open Means Interoperable
  • 26. That is good 
 “AMQP will be to Messaging what HTTP was to theWeb” MRG Clients run on any Platform Vendors are Interoperable
  • 27. That is good 
 “AMQP will be to Messaging what HTTP was to theWeb” MRG Clients run on any Platform Vendors are Interoperable 64K
  • 28. From Anywhere to Anywhere
  • 29. From Anywhere to Anywhere
  • 30. From Anywhere to Anywhere
  • 31. From Anywhere to Anywhere
  • 32. From Anywhere to Anywhere
  • 33. Quick Recap For Beer The ïŹfth male member of the A-Team, Frankie, was played by Question Message Queuing connects systems and components. Is it ideal for the cloud? Does Loose-Coupling make individual systems more likely to suffer outages? Yes No AMQP is Open. This makes it suitable for programming in C and Javascript?
  • 34. EddieVelez Quick Recap ✓ The ïŹfth male member of the A-Team, Frankie, was played by Question Message Queuing connects systems and components. Is it ideal for the cloud? Does Loose-Coupling make individual systems more likely to suffer outages? Yes No AMQP is Open. This makes it suitable for programming in C and Javascript? ! ✓
  • 35. Common Terms and Jargon Jargon
  • 36. Messaging: Which Jargon? EMail (SMTP, POP3, IMAP) VoIP (VoiceMail, XMPP) Texting (SMS) Instant Messaging (ICQ, MSN, Jabber) Twitter Enterprise Service Bus (ESB) Dynamic OO Languages (eg Ruby) Message Queuing (MQ) Message Queuing (MQ) What do we mean by Messaging?
  • 37. Essential Terms Message Queue Behaves like a Queue Is First-In First-Put (FIFO) Elements are Messages
  • 38. Essential Terms Message Queue What’s a Message? Envelope Payload Header
  • 39. Essential Terms *Strictly speaking a receiver polls for messages a consumer has messages pushed ≣ ≊Send Publish Enqueue ≣ ≊ DequeueConsume*Receive
  • 40. So how can you use it? Concepts Useful Book: Enterprise Integration Patterns Hohpe &Woolf
  • 41. Store and Forward Billing “Could you send me a duplicate of my bill please” REST
  • 42. Store and Forward Billing “Could you send me a duplicate of my bill please” REST !
  • 43. Store and Forward Billing “Could you send me a duplicate of my bill please” REST StormMQ Messaging Billing !
  • 44. Store and Forward Billing “Could you send me a duplicate of my bill please” REST StormMQ Messaging Billing ! !
  • 45. Store and Forward Billing “Could you send me a duplicate of my bill please” REST StormMQ Messaging Billing !
  • 46. Fire and Forget Shipping “Too many orders.The website is running like a dog.” SQL Push SQL Pull
  • 47. Fire and Forget Shipping “Too many orders.The website is running like a dog.” SQL Push SQL Pull StormMQ Messaging Shipping
  • 48. One-To-Many “There’s a new widget in the Catalogue: Tell all the systems.” Catalogue Shipping S-a-a-S Inventory File Transfer ETL
  • 49. One-To-Many “There’s a new widget in the Catalogue: Tell all the systems.” Catalogue Shipping S-a-a-S Inventory StormMQ Messaging
  • 50. Publish-Subscribe (“Topics”) “Shipments Sent, Delivered and Returned” Shipping S-a-a-S Inventory Billing AnySent Sent or Returned
  • 51. StormMQ Messaging Publish-Subscribe (“Topics”) “Shipments Sent, Delivered and Returned” Shipping S-a-a-S Inventory Billing AnySent Sent or Returned
  • 52. Round-Robin Billing “How do we easily scale a massive batch job like Billing?” EMail BillGenerate
  • 53. StormMQ Messaging Round-Robin Billing “How do we easily scale a massive batch job like Billing?” EMail BillGenerate
  • 55. AMQP Client AMQP ServerTCP / IP Network Connection Virtual Host Connections and Channels
  • 56. Connection AMQP Client AMQP ServerTCP / IP Network Connection Virtual Host Connections and Channels TLS “Shielding” Channels Each Channel is Independent: Effectively, aVirtual Connection
  • 57. Basic AMQP: Connections Basic AMQP: Connections Open a Connection to aVirtual Host Open a Channel Send a Message Receive a Message Close Channel Close Connection You only need one channel! " # $ % & ' How does this look in Code?
  • 58. // The API is styled similarly to Functionally Orientated Programming (FOP) // It makes extensive use of Constructor Injection and anonymous classes modelling 'blocks' // Closes are handled implicitly by design with exceptions thrown, ie try-ïŹnally is internal to the API public void demonstrateConnection() { ïŹnal AmqpConnectionFactory amqpConnectionFactory = amqpConnectionFactoryWhichVeriïŹesStormMQ(“mycompany”, “mysystem”, “development”, “user”, “password”); // Creates and closes a connection amqpConnectionFactory . useConnection ( // Creates and closes a channel on a connection new ChannelCreatingConnectionUser ( // Adapts a channel to make it convenient to use new ConvenientChannelCreatingConnectionUser ( new ConvenientChannelUser() ( public void use(ïŹnal @NotNull ConvenientChannel convenientChannel) { // Send a message, or, // Receive a message (or both) } ); ) ) ) }
  • 59. // Sending a Message public void use(ïŹnal @NotNull ConvenientChannel convenientChannel) { // ConvenientChannel has static convenience methods to create messageHeaders (meta-data) // Use them to signify a message's content’s MIME type or an unique id // Use meta data sparingly; think of it like email headers. More later ïŹnal BasicProperties messageHeaders = emptyBasicProperties(); // All messages are byte arrays ïŹnal byte[] messageBody = "HelloWorld" . getBytes( forName("UTF-8") ); // Send the message ïŹnal String routingKey = "usually the destination message queue"; ïŹnal boolean mandatory = false; ïŹnal boolean immediate = false; convenientChannel . basicPublish( "", routingKey, mandatory, immediate, messageHeaders, messageBody ); } /* Notes * Mandatory (mandatory = true) messages are returned unless routed to a queue * Immediate (mandatory = true) messages are returned unless there is another channel consuming */
  • 60. // Receiving a Message using Polling public void use(ïŹnal @NotNull ConvenientChannel convenientChannel) { ïŹnal boolean noAck = false; convenientChannel . basicGet( "queue", noAck, DoNothingWhenMessageNotReceived, new MessageReceived() { public void messageReceived(ïŹnal @NotNull GetResponse message) { ïŹnal byte[] messageBody = message . getBody(); ïŹnal BasicProperties messageHeaders = message . getProps(); // Acknowledge successfully received messages if noAck = false // If not acknowledged, they are eventually placed back on the queue for re-delivery convenientChannel . basicAck( message ); } }); } /* Notes * DoNothingWhenMessageNotReceived is a singleton of MesageNotReceived * Implement DoNothing to do something else, eg for debugging * Polling is thread-safe but inefïŹcient; using consumers (“push”) for more efïŹciency
 */
  • 61. // Consuming Messages using Push public void use(ïŹnal @NotNull ConvenientChannel convenientChannel) { ïŹnal boolean noAck = true; convenientChannel . basicConsume( "my queue", noAck, new ConvenientConsumer() { // Consumers run on a different thread public void handleDelivery( ïŹnal String consumerTag, ïŹnal Envelope envelope, ïŹnal BasicProperties messageHeaders, ïŹnal byte[] messageBody ) { ïŹnal byte[] messageBody = message . getBody(); ïŹnal BasicProperties messageHeaders = message . getProps(); // No need to acknowledge message as noAck = true } }); } /* Notes * Consumers only exist as long as a channel is open * Add a threading primitive (eg volatile boolean) and reference it at * * It is possible to use multiple channels with several consumers
 */ *
  • 62. ! ✓ Channels Complex Applications Consume on several threads Send on several threads Why Use More than One Channel? Recommendation: Keep it Simple! Simple Applications Send on a queue Receive on another Transactional Applications NeedTransactions on a queue Don’t NeedTransactions on another ✓
  • 63. Exchanges Route Messages Exchanges route Messages to Message Queues Exchange MQ A MQ B
  • 64. Exchanges Route Messages Exchanges route Messages to Message Queues You send messages to an exchange, not a message queue Exchange MQ A MQ B
  • 65. How do Exchanges Route? Exchange MQ A The Exchange ïŹnds a Binding matching the Routing Key # A Binding connects a Routing Key to one or more Message Queues $ Every sent message has a Routing Key " The Exchange delivers the Message to the Message Queue % A message queue can be bound more than once to one or more exchanges ( “string”
  • 66. Types of Exchange More rarely used exchange types include amq.headers and extensions Message Queue Name direct Like a ‘Map’:All MQs bound with the routing key receive copies of the message “” (blank) amq.direct fanout Empty String All MQs bound to the Exchange receive copies of the message amq.fanout topic Dotted Bindings use globbing expressions (wildcards) to route messages to MQs amq.topic A message queue can be bound more than once to an exchange; A message queue can be bound to more than one exchange But a message queue will only receive a message sent once Routing Key Routing Behaviour Default DeïŹnitions Point – to – Point One – to – Many Publish – SubscribeTypical Use
  • 67. // Declaring Exchanges public void use(ïŹnal @NotNull ConvenientChannel convenientChannel) { ïŹnal boolean passivelyDeclare = false; ïŹnal boolean durable = true; ïŹnal boolean autoDelete = false; // Just change the ExchangeType to one of direct, fanout or topic convenientChannel . exchangeDeclare( "my exchange A", direct, passivelyDeclare, durable, autoDelete ); convenientChannel . exchangeDeclare( "my exchange B", fanout, passivelyDeclare, durable, autoDelete ); convenientChannel . exchangeDeclare( "my exchange C", topic, passivelyDeclare, durable, autoDelete ); // A passive declaration asserts that an exchange exists, causing a channel exception if it does not convenientChannel . exchangeDeclare( "my exchange A", direct, true, durable, autoDelete ); } /* Notes * Always use durable = true with StormMQ as we are a hosted service * Nearly always use autoDelete = false as exchanges should be long-lived * Declaring an exchange twice is not an error; if parameters differ, new values are used if possible * Passive declaration is interesting but typical deployment practices mitigate its usefulness */
  • 68. // Declaring and Binding Message Queues public void use(ïŹnal @NotNull ConvenientChannel convenientChannel) { ïŹnal boolean passivelyDeclare = false; ïŹnal boolean durable = true; ïŹnal boolean autoDelete = false; ïŹnal boolean exclusive = false; // A declared queue is bound to the default ("") exchange with the routing key the queue name ("my queue") convenientChannel . queueDeclare( "my queue", passivelyDeclare, durable, exclusive, autoDelete ); // A message queue can be bound to another exchange with whatever key you choose convenientChannel . queueBind( "my queue", "another exchange", "some routing key" ); // When binding to a fanout exchange the routing key is the empty string ("") convenientChannel . queueBind( "my queue", "a fanout exchange, eg amq.fanout", "" ); // When binding to a topic exchange, set the routing key as a wildcard // Publish messages with speciïŹc routing keys eg "BONDS.USD.FTSE", "BONDS.USD.NYSE", "BONDS.GBP.FTSE" convenientChannel . queueBind( "my queue", "a fanout exchange, eg amq.topic", "BONDS.USD.*" ); } /* Notes * Always use durable = true with StormMQ as we are a hosted service * Nearly always use autoDelete = false as message queues should be long-lived * Declaring a message queue twice is not an error; if parameters differ, new values are used if possible * Exclusive message queues are for advanced usages and often aren’t needed */
  • 69. AMQP: Introducing Users but StormMQ enforces that the same Users and Permissions are in all of a System’s Environments Passwords are different Passwords are securely generated by StormMQ and are 512 bit keys ConïŹguration Managers can prevent revelation of passwords to different system users, eg developers vs sysadmins Aim: Separation of Environments A Connection can use several authentication mechanisms which are perVirtual Host but Commonest is User - Password andand Aim: Separation of Responsibility Users are intended to be system accounts (robots), not sysadmins Users have read, write and create permissions using a wildcard syntax: important to name queues, etc well
  • 70. // Example of create-system.json used with API call stormmq-create-system { "companyName" : "usuallyYourUserName", "systemName" : "anythingAlphabetic", "environments" : [{ "environmentName" : "development", // Different StormMQ clusters have different characteristics (and costs) "clusterName" : "free-1", // These are the StormMQ user accounts to which passwords for AMQP users (below) can be revealed for this environment (development) "permittedStormMQUserNames" : [ "developerPeter", "developerJames", "developerJohn" ] }], // User permissions operate on Message Queues and Exchanges "amqpUserPermissions" : { "queueReader" : { "create" : "^$", "read" : ".*", "write" : "^$" }, "queueWriter" : { "create" : "^$", "read" : "^$", "write" : ".*" }, "queueCreator" : { "create" : ".*", "read" : "^$", "write" : "^$" }, "onlyProcessingObjects" : { "create" : "^processing.*", "read" : "^processing.*", "write" : "^processing.*" } } }
  • 71. ConïŹguring AMQP “*Our REST API has Java, Ruby, PHP and .NET bindings” AMQP StormMQ ✓ ActiveMessage Queues Exchanges Bindings Users User Permissions Entire Systems ! Extra ! Extra ! Extra ✓ Active ✓ Active ✓ REST ✓ REST ✓ REST* Programmatic ConïŹg ✓ Same ✓ Same ✓ Same
  • 72. AMQP: Getting Statistics “*Password revelation is restricted to speciïŹc individuals” AMQP StormMQ Message Queues Exchanges Bindings Generated Passwords Usage Patterns Entire Systems ! Extra ! Extra ! Extra ✓ REST ✓ REST ✓ REST Programmatic Info ! Extra ✓ REST ! Extra ✓ REST* ! Extra ✓ REST
  • 73. // Getting Statistics from StormMQ using the REST API in Java // If you need to use proxies or experience the pain of Java SSL choose a different method in ApiConïŹguration ïŹnal ApiConïŹguration apiConïŹguration = directConnectionIfHavingProblemsWithSslVeriïŹcation(); // If your Magic Secret Key is in an unusual place choose a different method in Api ïŹnal Api api = apiByGuessingUsingOsConïŹgurationFiles( apiConïŹguration, stormMqUserName ); ïŹnal List<AmqpQueue> amqpQueues = api . listQueues( companyName, systemName, environmentName ); ïŹnal List<AmqpExchange> amqpExchanges = api . listExchanges( companyName, systemName, environmentName ); ïŹnal List<AmqpBinding> amqpBindings = api . listBindings( companyName, systemName, environmentName ); ïŹnal Map<AmqpUserName, AmqpUserPassword> passwords = api . listAmqpUserNamesAndPasswords( companyName, systemName, environmentName ); ïŹnal CompanyDetails companyDetails = api . describeCompany( companyName ); // Finding “what we’ve got” ïŹnal List<CompanyName> companyNames = api . listCompanies(); ïŹnal List<ClusterName> clusterNames = api . listClusters( companyName ); ïŹnal List<SystemName> systemNames = api . listSystems( companyName ); ïŹnal SystemDetails systemDetails = api . describeSystem( companyName, systemName ); ïŹnal Set<Environment> environments = systemDetails . getEnvironments(); /* Notes * Also consider the command-line tools stormmq-list-queues, stormmq-list-exchanges and stormmq-list-bindings * Further examples are in com.stormmq.api.Example (part of the url signer jar) */
  • 74. Virtual Hosts Virtual Hosts: Think Apache! Virtual Hosts isolate Message Queues Virtual Hosts isolate User Groups* Virtual Hosts isolate Exchanges* Virtual Hosts isolate Bindings* Virtual Hosts isolate Virtual Hosts: StormMQ Virtual Hosts isolateYour Company Virtual Hosts isolateYour Systems Virtual Hosts isolateYour Environments Enable ConïŹguration Management Virtual Hosts stop Data Accidents Widgets Ltd / Invoicing System / / Testing Development Production
  • 75. Message Properties Server Understood Good Practice “This is just the tip of messaging best practice with AMQP” Persistent = 1 Priority = 0 Timestamp = 4568965345 MessageId = 567A-GH-20100709 Priority Queues are per-Message Control life of a Message Persistence is per-Message Timestamps expire Messages Completely Optional MIME Content-Type Unique MessageId Schema &Version
  • 76. // Message Properties: Examples of Good Practice // Being explicit is good practice ïŹnal BasicProperties messageHeaders = new BasicProperties(); {{ DeliveryMode . NonPersistent . setOn( this ); Priority . Zero . setOn( this ); setMessageId( "My unique ID, eg a GUID or ascending value" ); // Explicit MIME type including charset; use application/octect-stream for trully binary data setContentType("application/json; charset=utf-8"); // Use compression for larger textual data; use the same values as HTTP headers; use "identity" for none setContentEncoding( "gzip" ); // Timestamp each message setTimestamp( new Date( System . currentTimeMillis() ) ); // Schema and version, perhaps using a XML namespace deïŹnition setType( "syslog-message_1.0.4" ); // Optional: Use an expiration to discard old messages that are stale (milliseconds, example is 5 minutes) setExpiration( Integer . toString( 5 * 60 * 1000) ); // Optional: Identify the sender for later debugging setAppId( "sending application name" ); setUserId( "role of sender, or, user of machine" ); // Optional: Identify domain or environment (consumer could error if working in different one) setClusterId( "production" ); }};
  • 77. And there is more! Transactions More Message Properties Custom Message Properties Immediate Delivery Additional Exchange Types Auto Deletion Fine-Grained User Permissions Queue Purging QoS