Rabbitmq的使用和可靠消息

一.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.csdn.net/Weixiaohuai/article/details/94760975

 

十.rabbitmq集群架构

1.主备模式

主节点提供读写,备份节点不提供读写,在主节点产生故障或宕机时,切换到备用节点,继续提供读写服务,相互转换.

场景:并发和数据量不高情况下,也称之为warren(兔子窝)模式

 

2.远程模式:

多活模式,简称shovel模式,把消息进行不同数据中心的复制工作,我们可以跨地域的让两个mq集群互联,用的不多,早期的集群

3.镜像模式

mirror镜像模式,保证数据100%数据不丢失,实际工作中用的最多的,搭建简单

100%数据可靠性解决方案一般是3节点

keepalived如何配置公网IP

脑列问题

 

4.多活模式

依赖federation插件

 

下游从上游主动拉取消息

 

发布了42 篇原创文章 · 获赞 25 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qq812858143/article/details/103319739
今日推荐