2.1 rabbitmq整体上是一个生产者消费者模型,主要负责接受存储转发消息
2.2 RabbitMq相关概念
Producer: 生产者,就是投递消息的一方。
消息一般包含两个部分:
消息体(payload):真正的消息内容
标签(label):路由key和交换机名称
Consumer: 消费者 就是接收消息的一方。只会消费消息体
Broker:消息服务器的节点,也可以看做是Rabbitmq服务器
Quene:队列,消息存放的地方,生产者投放,消费者消费,如果多个消费者监听同一个队列,会平摊所有消息,也就是轮询
Exchange:交换器,实际接收消息,再根据路由键投递到队列中
常用交换机类型:
direct: 路由键跟绑定键完全匹配才能投递消息
fanout:会将消息发送到所有的队列,不受路由键和绑定键的影响
topic: 每条消息会被发送到所有符合路由规则的key对应的队列;可以使用"*"和"#"两种通配符,*代表匹配任意一个关键词,#代表匹配一个或多个关键词;通配符和普通字符之间需要使用"."隔开
headers: 不依赖路由键,根据消息体的headers属性(一组键值对),需要跟交换机与队列之间绑定的键值对,完全一致,则投递消息,性能差,不实用
RoutingKey:路由键,
Binding:绑定键,指定交换机与队列的绑定规则,与路由键相对应
Connection: 一条Tcp连接,
Channel:信道
Channel是建立在Connection的基础上,一个连接可以创建多条信道,每个信道都会指派一个唯一的ID,信道是虚拟连接,RabbitMq处理命令是通过信道完成
Connection可以做到信道的效果,为什么引入信道?
Tcp连接的建立和销毁开销很大,建立多条连接,很容易造成性能瓶颈,采用Tcp连接复用,减少性能开销,方便管理;每个线程把持一个信道,保证数据的安全,复用同一个连接,可以在流量不是很大时,有效减少Tcp连接开销;如果信道的流量很大,则可以创建多个连接,分散信道

总结流程:
由product生产消息,将消息体和标签一起发送给交换机(标签内指定交换机和路由key),
将routingKey与exchange绑定的queue的bindingkey,根据不同类型exchange进行匹配,将消息投入队列,最后由consumer根据监听队列进行消费
AMQP指令:basic.publish 生产消息 basic.consumer 消费消息
2.3 AMQP 协议介绍
RabbitMQ 是遵从AMQP 协议的,AMQP的模型架构跟RabbitMq的模型架构一致,RabbitMQ 中的交换器、交换器类型、队列、绑 、路由键等都是遵循的 AMQP 议中相应的概念
RabbitMQ 还支持 STOMP,MQTT 等协议
AMQP 协议本身包括三层:
Module Layer: 于协议最高层,使用一些客户端命令 Queue Declare(声明一个队列)
Session Layer: 位于中间层,接收客户端命令给服务端,将服务端应答返回给客户端
Transport Layer: 于最底层,主要传输二进制数据流,提供帧的处理、信道复用、错
误检测和数据表示等。
2.4 消息流转过程
生产者:
1.建立连接
2.开启信道
3.发送消息,指令basic.Publish 也就是 方法中的channel.basicPublish(),将信道置为投递模式
4.释放资源

消费者:
1.建立连接
2.开启信道
3.准备接收消息,指令basic.consume 也就是代码中的channel.basicConsume(),将信道置为接收模式,Broker指令Basic.consume-OK返回,以提示消费者准备消费消息
4.broker推送消息,指令Basic.deliver 进行推送消息
5.发送确认,接收消息并消费以后,执行Basic.Ack发送确认
6.释放资源
