为什么rabbitmq是基于通道的(Chanel)而不是TCP连接(Connect)的
- TCP连接的创建和销毁开销大,创建需要3次握手,销毁需要4次分手
- 如果不用信道,那应用程序会TCP连接到RAbbit服务器,高峰时会造成大量的连接从而造成巨大的资源浪费,而且底层操作系统对于每秒TCP的连接数量是有着限制的,使用连接的方式必定会造成性能瓶颈
- 信道的原理是一条线程一个信道,多线程,多信道共用一条TCP连接,即使每秒有着大量的请求也不会造成性能瓶颈
为什么选择Rabbitmq作为消息组建
- 和Spring同源,支持度较高
- 支持事务和支持持久化
- 高可用,高可靠
AMQP生产者流转过程和AMQP消费流转过程
- 生产者
- 创建连接——》携带连接信息尝试连接服务器——》正常响应
- 创建通道——》通道就绪——》发送消息——》释放资源
- 消费者
- 建立连接——》开启通道——》准备接收消息
- broker推送消息——》发送确认消息(手动应答/自动应答)——》应答成功,移除队列,应答失败,进行重试
- 释放资源
可以存在没有交换机的队列吗
虽然没有指定交换机,但是一定会存在一个默认的交换机,默认交换机的类型是【direct】
因为底层是Erlang实现,Erlang是专门开发交换机的语言,交换机是专门进行消息投递和分发的
virtual host 相当于数据库的概念
开发中最好指定交换机,不要使用默认的交换机
RabbitMQ核心组成部分有哪些
名称 | 含义 |
---|---|
broker | 相当于rabbitmq-server |
producer | 消息生产者 |
consumer | 消息消费者 |
exchange | 交换机,负责消息的投递和分发 |
Routing key | 路由key,唯一,实现精准投递消息 |
virtual host | 虚拟节点,相当于数据库的概念 |
RabbitMQ的运行流程
rabbitmq的消息投递都是投递到交换机,然后由交换机推送消息到队列,消费者监听队列,进行获取消息
不存在的交换机投递消息会如何
不存在的队列消费会如何
无法消费,也不会自动创建队列
交换机和队列的声明和绑定是定义在生产者好还是定义在消费者好
都可以,最好在消费者配置,因为消费者是最先启动的,如果不存在队列,会造成服务无法启动
- 一般建议在操作面板进行创建,减少代码耦合
- 建议在消费者创建,但是可能会恰好创建的时候生产者在生产消息,就可能会造成消息丢失
- 生产者创建,稳妥,不会造成消息丢失
- 两者都创建,会进行覆盖操作
消息什么时候会进入死信队列
消息过期之后,超过消息最大数量,消息被拒绝消费