一.rabbitmq安装
说明:erlang和rabbitmq版本需要匹配,可官网查看匹配关系
1.安装erlang环境
yum install erlang
erlang -version查看是否安装成功
2.安装rabbitmq
yum install rabbitmq-server
4.设置开机自启动
chkconfig rabbitmq-server on
5.设置配置文件
cd /etc/rabbitmq
cp /usr/share/doc/rabbitmq-server-3.4.1/rabbitmq.config.example /etc/rabbitmq/
mv rabbitmq.config.example rabbitmq.config
将example配置移动到rabbitmq的配置并重命名
6.配置文件中开启用户远程访问
vi /etc/rabbitmq/rabbitmq.config
开启配置中{loopback_users,[]},去掉末尾逗号
7.开启web界面管理工具
rabbitmq-plugins enable rabbitmq_management
8.防火墙开启15672端口
或者关闭防火墙
永久开放端口:firewall-cmd --permanent --add-port=15672/tcp
重新加载开放的端口:firewall-cmd --reload
查看运行状态:firewall-cmd --state
查看开放的端口:firewall-cmd --list-ports
centos7使用的systemctl管理防火墙
# systemctl start firewalld # 启动,
# systemctl enable firewalld # 开机启动
# systemctl stop firewalld # 关闭
# systemctl disable firewalld # 取消开机启动
9.常用命令
//启动
service rabbitmq-server start
//查看状态
service rabbitmq-server status
//关闭
service rabbitmq-server stop
二.创建用户
1.登录管理页面
http://101ycy.com:15672/ guest guest
2.admin页签中添加admin用户,角色为administrator
3.角色类型
超级管理员:administrator,可登录管理控制台,查看所有信息,对用户,策略(policy)进行操作
监控者:monitoring,可登录管理控制台,查看mq节点相关信息(进程数,内存使用,磁盘使用情况等)
策略制定者:policymaker,可登录管理控制台,对policy进行管理,但无法查看mq节点相关信息
普通管理者:management,仅可登录管理控制台,无法看到节点信息,也无法对策略进行管理
其它:无法登录管理控制台,通常就是普通的生产者和消费者
三.创建虚拟主机
1.定义:相当于数据库的库
2.意义:一个虚拟主机持有一组交换机,队列和绑定,在rabbitmq中用户只能在虚拟主机的粒度做权限控制
四.工作的六种模式介绍
1.简单队列
不指定交换机,直接发送到队列
2.工作队列
基本同简单队列,多个消费者消费队列,默认轮询分发,可以设置basicQos(perfetch=1),消费者手动应答ack,才会发送下一条消息,可以保证处理快的接到更多消息
3.路由模式(交换机为direct直连交换机)
交换机和队列绑定,并设置路由键routing key
消息发送到直连交换机并携带路由键,则会投递到对应的队列
4.发布订阅模式/广播模式(交换机为fanout扇形交换机)
交换机和多个队列绑定
消息发送到交换机则将投递到绑定的所有队列
5.通配符/主题模式(交换机为topic交换机)
类似路由模式,只不过路由键可以包含通配符
路由键中#匹配一个或多个词,*匹配一个词,例如hello.word,hello.*,hello.#
五.rabbitmq使用场景
1.异步处理
例如用户注册时,发短信和邮件提醒;反欺诈系统调用数据服务平台也是异步调用
优点:调用端无需等待结果
2.应用解耦
从A系统将数据给B系统,用MQ队列可以解除强依赖,假如B系统故障也不会影响A系统和消息系统
3.流量削峰
防止大量请求涌入系统,消息先到mq,然后以一定速率消费mq消息
4.消息分发
5.消息缓冲
六.概念说明
1.broker:消息队列服务实体
2.exchange:消息交换机,指定消息规则,处理消息和队列之间的关系,可以绑定队列也可以绑定交换机
3.queue:队列,消息投入到队列
4.binding:绑定,把交换机和队列按路由规则绑定
5.routing key:路由键,交换机根据这个进行消息投递
6.vhost:虚拟消息服务器,vhost之间完全隔离,不同vhost之间无法共享交换机和队列,主要用于划分不同业务模块,可以做权限控制
7.producer:生产者,投递消息
8.consumer:消费者,接受消息
9.channel:信道,打开信道才能通信,一个信道代表一个会话任务,是真实tcp上的虚拟连接
七.死亡交换机的用途
消费者通过basic.reject拒绝或者无法投递会放入这里的队列,用于排查问题消息
八.消息确认发送
confirm(确认回调) return(失败回调) /callbak
1.交换机和队列都对: 执行ack=true
2.交换机错误,队列正确: 执行ack=false
3.交换机正确,队列错我: 执行ack=true 失败执行
4.交换机和队列都错: 执行ack=false
九.消息可靠投递
两种方案:如下图,图片来自网络
对消息进行持久化,性能差点
消息延迟投递,做二次校验,失败则RPC重新发送消息,但是延迟消息投递的消息也可能失败,只是多了一层保障
另外的一些方式补充:
一种是采用rabbitmq的事务机制,生产者设置开启事务,并在发送方法上注解transactional,发生异常则回滚,每次提交都是阻塞式等待服务处理返回结果,性能影响大,一般不采用
1.配置情况
持久化配置:交换机,队列和消息都设置为持久化
正常交换机配置:为主题或者路由模式
备份交换机配置:为广播模式(这样不用配置路由key),且绑定两个队列,报警队列和不可投递消息队列,报警队列用于发送邮件,短信等及时报警
绑定备份交换机:正常交换机配置alternate-exchange参数指定备份交换机名称即可绑定
触发条件:当消息不能正确投递到正常交换机的队列,则会把消息发送到备份交换机上
备份交换机也收不到:此时会触发confirmcallback和returncallback,需要启用
到达不了交换机触发confirmcallback为false,达到不了队列触发returncallback
流程:
投递交换机时,将id和msg写入redis,如果投递交换机失败则在confirm中根据id读取redis中的msg写入mongodb作为投递失败消息记录,然后定时任务扫描重新投递,成功则标志成功
如果转发到队列失败,则将,消息写入mongo,同上
2.简单描述可靠投递:投递到正常交换机,如果失败则投递到备份交换机,如果失败就在confirm或return回调里把消息记录到mongo,用定时器扫描重新投递并更新状态
3.可靠消费
消费者开启手动应答模式,处理成功则basicAck,两个参数,一个是唯一标识,另一个一次性ack所有小于唯一标识的所有消息
失败则basicReject且requeue=false,如果有死信交换机则进入死信交换机,两个参数,一个是唯一标识,第二个是是否重新放入队列
配置死信交换机和死信队列:
在生产者可配置
图示如下:来自https://blog.youkuaiyun.com/Weixiaohuai/article/details/94760975
十.rabbitmq集群架构
1.主备模式
主节点提供读写,备份节点不提供读写,在主节点产生故障或宕机时,切换到备用节点,继续提供读写服务,相互转换.
场景:并发和数据量不高情况下,也称之为warren(兔子窝)模式
2.远程模式:
多活模式,简称shovel模式,把消息进行不同数据中心的复制工作,我们可以跨地域的让两个mq集群互联,用的不多,早期的集群
3.镜像模式
mirror镜像模式,保证数据100%数据不丢失,实际工作中用的最多的,搭建简单
100%数据可靠性解决方案一般是3节点
keepalived如何配置公网IP
脑列问题
4.多活模式
依赖federation插件
下游从上游主动拉取消息