志宇-RabbitMQ学习

RabbitMQ安装

推荐使用docker安装,不然要安装Erlang语言环境相对麻烦
1、拉取镜像
docker pull rabbitmq:management
2、启动RabbitMQ
docker run -d 以守护进程方式在后台运行
--hostname rabbit_host1 设定容器的主机名(集群区分节点)
--name xd_rabbit 指定容器名
-e RABBITMQ_DEFAULT_USER=admin 用户名
-e RABBITMQ_DEFAULT_PASS=admin 密码
-p 15672:15672 控制台界面管理的端口映射
-p 5672:5672 程序访问的端口映射
rabbitmq:management
3、查看启动日志
docker logs 返回的容器id
4、控制台访问(使用配置的用户名和密码)
http://www.lizhiyu.xyz:15672/

RabbitMQ使用

java依赖
简单使用、不使用交换机、任务只会被一个消费者消费

RabbitMQ发送消息步骤图

在这里插入图片描述

上图说明如下
1、如上包括发送客户端、RabbitMQ server、接收客户端
2、RabbitMQ server中又包括 Virtual host(虚拟主机)exchange(交换机)queue(队列)
3、虚拟主机 可以用于区分开发环境,发送端发送数据时要指定发送给哪个环境
4、队列 用于存储消息
5、交换机 交换机接收发送端发送的路由键(RoutingKey 最大长度255字节),根据接收的RoutingKey和配置的路由规则将发送的信息传递给指定队列(起到路由的作用)
 
使用说明如下
1、在RabbitMQ控制台创建虚拟主机(一个虚拟主机下默认有7个exchange)
2、创建交换机
  交换机类型有5种 direct,fanout,topic,headers,system
  fanout 代表广播类型
         (也就是绑定的所有队列都会接收信息、这样RoutingKey就不用了因不需要路由到指定队列)
  direct 代表直连类型
         (可以通过指定的RouterKey路由到指定的队列)
         例如:RouterKey为aaa则路由到aaa对应的队列
  topic  代表主题类型
         (可以通过一类的RouterKey进行路由到指定的队列)
  		 符号“#”匹配一个或多个词,符号“*”匹配不多不少一个词
  		 例如:RouterKey为aaa.*.* 或 aaa.* 会路由到aaa.#对应的队列
		     RouterKey为aaa.* 会路由到aaa.*对应的队列
		     topic相对于direct和fanout更加灵活
  不使用交换机,不设置交换机这样就是用了默认交换机(来达到消息只被消费一次)
3、创建队列
   设定队列中存储内容持久化到本地(用于RabbitMQ崩溃后重启队列中已经存储的数据不丢失)
   设定队列最大长度
   设定队列是否独占
   ttl说明:time to live 消息存活时间
   设定队列中信息的ttl(队列中信息过了指定时长没有被消费、就会处理这个消息)
   设置死信交换机(将队列中的消息超过时长则将消息发送给死信交换机处理)
   当消费者拒收消息或队列满了或队列中消息ttl达到极限则会将消息发送给信交换机
5、将交换机和队列通过RoutingKey的规则进行绑定(目的:设定路由规则)
   也就是说下次发送端发送过来的RoutingKey会根据设定的规则发送到指定队列
6、发送端设定用户名、密码、端口、虚拟主机、以及RouteringKey、交换机、将消息发送

RabbitMQ广播(Exchange的fanout类型使用)

RabbitMQ指定交换机给哪些队列发送消息(Exchange的direct类型使用)

RabbitMQ根据消息类型将消息发送给指定队列(Exchange的topic类型使用)

公平消费和消息可靠性传递

消息可靠性传递要确保使用如下方法

一、接收端使用消息确认机制(从而确认消费端是否消费此任务)
二、RabbitMQ队列消息持久化到内存中(在RabbitMQ崩溃后重启确保任务不丢失)
三、发送端发布确认机制(在RabbitMQ崩溃时,有可能有些正在发布的任务还没有持久化,还在内存中从而导致消息丢失)
发布确认分为两个阶段
  1.发送端成功将消息发送给交换机(exchange),exchange成功接收消息
  2.交换机(exchange)根据routerKey将消息发送给指定队列,队列成功接收消息
  3.如果消息发送失败,失败后会触发监听然后重新发送消息(可以设置重新发送的次数)

公平消费的方法

RabbitMQ没有办法感知接收端正在处理的任务数量,仅仅是平均分配,这达不到我们想要的公平消费,通过接收端没有确认的消息数量来判断正在处理的任务数来达到公平消费。

防止重复消费

消息重复会重复的原因

1、在生产者将消息发送给交换机后,可能由于网络原因生产者没有收到交换机已经收到消息的回复,导致生产者将同一条消息再次发送给交换机
2、队列中的消息交给消费者消费过程中,可能由于网络原因队列没有收到消费者已经消费了此消息的回复,导致队列中的消息再次被消费者消费

防止重复消费

网络问题无法解决需要消费者处接口处理保持幂等性
1、根据消息的唯一id,使用redis 自增,如果增加到1则不进行处理

有序消费

有序消费 场景1:一个生产者对应一个消费者
在这里插入图片描述

生产者为单节点
消息投放到同一个队列
队列对应的消费者只有一个
消费者不开启线程处理消息(如果开启线程要求在消费者处声明多个内存队列,每个队列中按顺序存储要消费的消息)

有序消费 场景2:一个生产者对应多个消费者
在这里插入图片描述

消费者根据RouterKey将顺序执行的消息投放到同一个队列中
每个队列仅有一个消费者进行消费

消息堆积怎么处理

首先看功能是否需要暂停,找到错误原因
将旧的消息移动到一个缓存队列中,首先不影响新的消息被消费
然后在慢慢消费缓存队列中的信息

spring集成RabbitMQ使用

springAMQP文档
springAMQP详细说明
自学代码地址

RabbitMQ知识点

1、purge  清除(在清空队列消息时候用到)
2、消息移动
3、手动确认和自动确认
  自动确认:可以配置重试次数,重试超过固定次数则抛弃或另外处理此消息
  手动确认:队列将消息发送给消费者后,如果消费者不回复队列会一直任务此消息消费者一直在执行(必须要给队列一个回复是否执行成功,不然队列会一直等着这条信息执行完,除非消费者挂掉了再分配此消息)
  手动确认如果没有成功消费时:可以用reids中的标识来判断是否要再次入队
4、队列排他独占
5、通过死信队列延时执行任务时候,队列和死信交换机绑定的ttl等参数消费者重启后不会覆盖,需要重启前删除此队列、或者没有修改此队队列对应参数

SpringBoot集成RabbitMQ源码学习

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值