rabbitmq学习笔记
正文
RabbitMQ
简介
简介
2006年,AMQP规范发布。
2007年,Rabbit技术公司基于AMQP标准开发的RabbitMQ 1.0 发布
AMQP
AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。
基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件同产品,不同的开发语言等条件的限制
工作模型
RabbitMQ采用Erlang语言开发。Erlang语言由Ericson设计,专门为开发concurrent和distribution系统的一种语言,在电信领域使用广泛
RabbitMQ优点
安装
- Erlang
- 先安装依赖
yum install unixODBC unixODBC-devel -y
yum -y install ncurses-devel - 下载解压,进入目录指定安装目录
tar -xzvf otp_src_20.3.tar.gz
cd otp_src_20.3
./configure --prefix=/usr/local/erlang - 安装
make && make install - 添加环境变量(必须添加)
vim /etc/profile
在末尾加入以下内容:
export PAHT=$PATH:/usr/local/erlang/bin
- 先安装依赖
source /etc/profile
测试
- RabbitMQ
下载解压进入目录,启动插件
cd sbin/
//启动web管理插件,可访问页面
./rabbitmq-plugins enable rabbitmq_management
启动,如果不成功,可以把 -detached去掉看看什么原因,这个是后台启动
./rabbitmq-server -detached
- 创建用户,访问页面
./rabbitmqctl add_user admin admin
设置权限
./rabbitmqctl set_user_tags admin administrator
浏览器就能访问了,默认端口是15672,所以还需要开放下端口:
firewall-cmd --zone=public --add-port=15672/tcp --permanent
firewall-cmd --reload
访问,guest在3.3.0之后是无法登陆的,需要创建新用户
可以在登录之后设置权限,权限设置后需要重启
入门
如果报连接超时异常,可能是依赖版本不对
-
org.springframework.boot spring-boot-starter-amqp 1.5.10.RELEASE - 我之前用的springboot是2.0.6版本的,一直报连接超时,改成1.5.10版本就可以了
- 或者把rabbitmq升级到3.7.9版本也不报错
java原生API版hello world
-
生产者
-
消费者
springboot整合版helloworld
-
添加依赖
org.springframework.boot spring-boot-starter-amqp -
配置
queue需要先配置好,不然消费者使用的时候启动时候会报错
-
连接用户需要授权,或者使用guest
-
实际测试中开始会报连接超时异常,但是之后会自动连接成功
-
发送接受消息
-
生产者
-
消费者
-
相关概念
-
Exchange(交换器)
生产者将消息发送到交换机上,由交换机路由到一个或多个队列中,如果路由不到,或者返回给生产者或者被丢弃
-
RoutingKey(路由键)
-
Binding(绑定)
通过绑定将交换机与队列关联起来,绑定时候一般会指定一个BindindKey
交换器类型
-
fanout : 扇形交换机,转发消息到所有绑定队列
-
direct : 直连交换机,转发消息到routigKey指定的队列
-
topic:主题交换机,按规则转发消息(最灵活)
*可以匹配一个标识符。
可以匹配0个或多个标识符
-
headers : 首部交换机
- headers类型的交换机分发消息不依赖routingKey,是使用发送消息时basicProperties对象中的headers来匹配的。
headers是一个键值对类型,发送者发送消息时将这些键值对放到basicProperties对象中的headers字段中,队列绑定交换机时绑定一些键值对,当两者匹配时,队列就可以收到消息 - 不推荐使用,性能差
- headers类型的交换机分发消息不依赖routingKey,是使用发送消息时basicProperties对象中的headers来匹配的。
客户端开发
原生API
-
exchangeDeclare
-
queueDeclare
-
queueBind
-
exchangeBind
-
发送消息
-
消费消息
-
push
-
pull
-
-
消息确认机制
-
消费端拒绝消息
-
消息重入队列
springboot
- 提前配置bean和yml,使用template即可
- 后面笔记都会采用springboot方式开发,可参考,不会再用原生API
进阶
坑: 如果之前设置交互器和队列错了,之后修改代码后先删除之前的交互器和队列,否则没有用也不报错
mandatory参数
可直接在配置文件设置
配置中已经绑定这里可以直接使用
备份交换器
可在创建交换器时指定备份交换器存储未路由的消息,就不用mandatory参数了,如果设置了,备份优先
测试消息会进入备份交换器
过期时间
-
消息
-
队列设置(所有消息过期时间相同)
-
消息设置,单条消息有各自的过期时间
可设置属性可以参考客户端开发中原生API
-
-
队列
此时间是指过期时间内没有使用会被删除,使用了之后重新开始计算,不能为0
死信队列
配置死信队列:
- 消息过期之后会自动到死信队列中
延迟队列
rabbitmq本身没有支持,但是可以使用过期和死信实现延迟
消费者订阅死信队列即可消费延迟后的消息,即生产者生产消息过期之后进入死信被消费,即延迟
优先级队列
先配置好队列,然后发送消息让消息堆积
之后再进行消费
队列之间没有优先级,同一个队列中优先级高的优先消费,这里是因为我定义队列Bean的时候没有加后面的map,实际应该是54321消费
RPC实现(远程调用)
-
客户端发送消息时设置回调队列与标识
-
远程服务端监听到消息处理结果推送到回调队列中
-
客户端通过标识匹配拿到结果
- 监听回调队列,匹配结果
生产者确认
可确认消息是否成功发送到rabbitmq中
消费端注意点
-
开启手动确认
-
确认或者拒绝消息
-
消息分发
springboot中直接配置
管理
vhost(虚拟主机)
-
增
-
删
-
查
获取当前vhost相关信息, /是默认的那个
权限
- 查询权限
用户
-
增
-
删
-
查
-
设置角色
Web端 (management插件)
-
查看当前插件信息
- ./rabbitmq-plugins list
- E* 开头的为显式启动 e*开头为隐式启动
-
web端管理页面
- 可视化操作命令能做的一切
- 可视化操作命令能做的一切
-
开启与关闭插件
- ./rabbitmq-plugins enable rabbitmq_management
应用
- rabbitmqctl shutdown
- rabbitmqctl stop _ app
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架