AMQP协议
AMQP(高级消息队列协议)是一个能让符合统一标准的客户端和中间件进行消息传输的消息协议。是RabbitMQ主要实现支持的协议的一种。
涉及到的相关概念的介绍
publisher:发送消息到broker的客户端。
receiver:接受broker发来的消息的客户端。
AMQP消息模型
Publisher发送到broker的消息,首先被发到了broker中的Exchanges,Exchanges根据被称作bindings的规则,将消息的拷贝发送到对应的queues中,然后broker会将queues中的消息发送到订阅相应queues的consumer。
Exchanges,bindings和queues被统称为amqp的实体
Excange and Exchange Types
pulisher实际是发送消息到broker中的Exchanges,然后Exchanges将消息路由到对应的queues。路由规则是由Exchange type和bindings来决定的。
Exchange Types
Name | Default pre-declared names |
---|---|
Direct exchange | (Empty string) and amq.direct |
Fanout exchange | amq.fanout |
Topic exchange | amq.topic |
Headers exchange | amq.match (and amq.headers in RabbitMQ) |
在声明Exchange时,除了可以指定Exchange Type,还可以指定一些其它的属性:
- Name
- Durability (定义Exchange是永久还是临时的,临时性的Exchange在broker重启后就会消失)
- Auto-delete (定义这个属性后,当没有任何queue和此Exchange绑定时,此Exchange会被自动删除)
- Arguments (optional, used by plugins and broker-specific features)
Default Exchange
default exchange 是被broker预先声明的name为空的direct exchange。
当使用default exchange 时,我们声明一个名为"xxxxx"的queue,这个queue会以值为"xxxxx"的route-key绑定到default exchange。(即声明的queue会自动以queue name作为routing key绑定)
Direct Exchange
direct exchange根据消息的routing key将消息发送给相应的queue。
direct exchange对用于将任务循环分配给多个worker的场景。消息会被负载均衡到多个consumer,不是负载均衡到多个queue。
自己理解的完整消息转发流程
在exchange type 为direct的情况下,broker会把匹配上routing_key的消息完整的发送给每一个合适的queue里,然后queue会将消息均衡到绑定到器上的
Fanout Exchange
broker会把发送到fanout exchange的消息转发给所有绑定到此exchange的queue,不会去匹配routing key。
Topic Exchange
Headers Exchange
headers exchange 通过消息头部的属性而不是routing_key进行消息路由。
java客户端代码开发示例
主要接口和方法
Exchange 声明
exchangeDeclare(String exchange, BuiltinExchangeType type,boolean durable, boolean autoDelete):声明non-autodelete, non-durable
DIRECT
服务端安装和配置
安装(ubuntu14.04)
直接通过apt repository进行安装
echo 'deb http://www.rabbitmq.com/debian/ testing main' | sudo tee /etc/apt/sources.list.d/rabbitmq.list
wget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc | sudo apt-key add -
sudo apt-get update
sudo apt-get install rabbitmq-server
** 安装相关问题参考地址:http://http://www.rabbitmq.com/install-debian.html **