一.rabbitMq遵从AMQP协议(高级消息队列协议)
AMQP帧由五个不同的组件组成:
- 协议头帧用于连接到rabbitmq,进使用一次。
- 方法帧携带发送给rabbitmq或者从rabbitmq接收到的rpc请求或者响应
- 内容头包含一条消息的大小和属性。
- 消息体帧包含消息的内容
- 心跳帧在客户端与rabbitmq直接进行传递,作为一种校验机制确保连接的两端都可用并且正常工作。
二.rabbitMq消息发送
- 一条完整的消息应该包括方法帧,消息帧帧,内容头帧
- 方法帧的结构包括:交换机,队列,路由键值等
- 内容头帧结构:
-
content-type:消息体的报文编码,如application/json
-
expiration:消息过期时间
-
reply-to:响应消息的队列名
-
content-encoding:报文压缩的编码,如gzip
-
message-id:消息的编号
-
correlation-id:链路id
-
deliver-mode:告诉rabbitmq将消息写入磁盘还是内存
-
user-id:投递消息的用户(发送消息时不要设置该值)
-
timestamp:投递消息的时间
-
headers:定义一些属性,可用于实现rabbitmq路由(比如exchange类型是headers的时候用到)
-
消息结构体帧:message-body
-
Rabbit MQ提供了一个更加轻量级的机制来保证生产者可以感知服务器消息是否已被路由到正确的队列中——/confirm/i。如果设置channel为/confirm/i状态,则通过该channel发送的消息都会被分配一个唯一的ID,然后一旦该消息被正确的路由到匹配的队列中后,服务器会返回给生产者一个/confirm/i,该/confirm/i包含该消息的ID,这样生产者就会知道该消息已被正确分发。对于持久化消息,只有该消息被持久化后,才会返回/confirm/i
-
/confirm/i的最大优点是异步,生产者在发送消息以后,即可继续执行其他任务(也就是异步监听服务端的ack即可)。而服务器返回/confirm/i后,会触发生产者的回调函数,生产者在回调函数中处理/confirm/i信息。如果消息服务器发生异常,导致该消息丢失,会返回给生产者一个nack,表示消息已经丢失,这样生产者就可以通过重发消息,保证消息不丢失。/confirm/i机制在性能上要比事务优越很多。
三. rabbitMq的常用消息模式 -
路由模式——将当前交换机下数据提交到绑定的队列中
如图:(工作模式)
8. direct模式——交换机把消息路由到那些binding key与routing key完全匹配的Queue中
如图:(广播模式)
9. topic模式——采用通配符
Topic 类型 Exchange 可以让队列在绑定 Routing key 的时候使用通配符!
四.应用场景
1. 适用不同的开发环境解耦
2. 对大量的数据涌入削峰
3. 对于长时间的请求异步



