为什么rabbitmq是基于通道的(Chanel)而不是TCP连接(Connect)的

  1. TCP连接的创建和销毁开销大,创建需要3次握手,销毁需要4次分手
  2. 如果不用信道,那应用程序会TCP连接到RAbbit服务器,高峰时会造成大量的连接从而造成巨大的资源浪费,而且底层操作系统对于每秒TCP的连接数量是有着限制的,使用连接的方式必定会造成性能瓶颈
  3. 信道的原理是一条线程一个信道,多线程,多信道共用一条TCP连接,即使每秒有着大量的请求也不会造成性能瓶颈

为什么选择Rabbitmq作为消息组建

  1. 和Spring同源,支持度较高
  2. 支持事务和支持持久化
  3. 高可用,高可靠

AMQP生产者流转过程和AMQP消费流转过程

  • 生产者
  1. 创建连接——》携带连接信息尝试连接服务器——》正常响应
  2. 创建通道——》通道就绪——》发送消息——》释放资源
  • 消费者
  1. 建立连接——》开启通道——》准备接收消息
  2. broker推送消息——》发送确认消息(手动应答/自动应答)——》应答成功,移除队列,应答失败,进行重试
  3. 释放资源

可以存在没有交换机的队列吗

虽然没有指定交换机,但是一定会存在一个默认的交换机,默认交换机的类型是【direct
因为底层是Erlang实现,Erlang是专门开发交换机的语言,交换机是专门进行消息投递和分发的
virtual host 相当于数据库的概念
开发中最好指定交换机,不要使用默认的交换机

RabbitMQ核心组成部分有哪些

名称 含义
broker 相当于rabbitmq-server
producer 消息生产者
consumer 消息消费者
exchange 交换机,负责消息的投递和分发
Routing key 路由key,唯一,实现精准投递消息
virtual host 虚拟节点,相当于数据库的概念

RabbitMQ的运行流程

rabbitmq的消息投递都是投递到交换机,然后由交换机推送消息到队列,消费者监听队列,进行获取消息

不存在的交换机投递消息会如何

无法投递消息,也不会自动创建

不存在的队列消费会如何

无法消费,也不会自动创建队列

交换机和队列的声明和绑定是定义在生产者好还是定义在消费者好

都可以,最好在消费者配置,因为消费者是最先启动的,如果不存在队列,会造成服务无法启动

  1. 一般建议在操作面板进行创建,减少代码耦合
  2. 建议在消费者创建,但是可能会恰好创建的时候生产者在生产消息,就可能会造成消息丢失
  3. 生产者创建,稳妥,不会造成消息丢失
  4. 两者都创建,会进行覆盖操作

消息什么时候会进入死信队列

消息过期之后,超过消息最大数量,消息被拒绝消费