RabbitMQ-基础知识总结
MQ优势:
1.应用解耦
提高系统容错率和可维护率. 实现方式:将消息生产者与消费者之间,引入MQ,服务之间不直接调用,而是生产者将消息发送给MQ,由MQ分发给一个或多个消费者,即使一个服务出问题,也不会影响其他服务获取消息.
2.异步提速
原来同步调用方式的消耗时间是,消息生产者和每个消息消费者处理消息的时间总和,但是MQ利用异步调用方式,消耗时间仅是自己的处理时间和将消息转发给MQ消耗的时间,大大缩短了处理消息的时间.
3.削峰填谷
当在一定时间时并发量突然增加的时候,有可能就会导致超过系统的最大处理量,造成系统宕机,此时引入MQ,就可以将消息先接收到MQ中,然后消息排队,系统分批次处理,虽然时间慢,但是增加了系统的稳定性,这就是削峰.当高并发时间过后,MQ中肯定还会有堆积数据,还会交给系统处理,这个就是填谷.
思考-MQ存在的问题:
如何保证MQ的高可用? 通过构建高可用的MQ集群方式.
如何保证消息没有被重复消费? 幂等性处理
如何处理消息丢失情况?
1.rabbitMQ里的交换机,队列,消息中的数据是可以进行持久化的.
如何保证消息传递的顺序性?
如何保证消息数据处理的一致性?
RabbitMQ
MQ产品介绍:
RabbitMQ: 开发语言:Erlang 协议支持:AMQP 单级吞吐量:万级
RocketMQ:单级吞吐量最好 但是客户端支持语言少,技术不太成熟
Kafka:只要支持大数据领域
5种工作模式:
1.简单模式
发送方式: 一个生产者 - queue - 一个消费者
2.work模式:
发送方式: 一个生产者 - queue - 多个消费者按能力处理消息
使用场景:抢红包
3.广播模式:性能最高,因为不需要寻找queue
发送方式: 一个生产者 - exchange - 所有与交换机绑定的queue - 多个消费者 全部发送
使用场景:网站的推送消息,群聊,弹窗广告
4.路由模式
发送方式: 一个生产者 - exchange -所有与交换机绑定并符合条件的queue - 多个消费者
使用场景:app注册后根据不同的用户的信息选择发短信或邮件等
5.通配符(主题)模式
发送方式: 是路由模式的升级,引入通配符 *代表一个单词 #代表0或多个单词 注意是单词
生产者确认模式(confirm):
消息从product 到 exchange是否成功.成功和失败都可以监控
步骤:
1.在配置文件中开启生产者确认模式 spring.rabbit.publisher-confirm-type: correlated
2.新建一个配置类,实现RabbitTemplate.ConfirmCallback
1.重写confirm()确认方法 参数:ack表示消息到路由是否成功 cause表示失败原因
2.添加一个initRabbitTemplate()方法,添加@postConstruct(spring中的早期初始化注解)注解,写入代码:rabbitTemplate.setConfirmCallback(this::confirm); 代表在rabbitTemplate初始化完成后,立即执行这个方法,设置生产者确认机制和return机制.
生产者退回模式(return):
消息从exchange到 queue是否成功.只能检测到失败,成功不能监控
步骤:
1.在配置文件中开启生产者退回模式 spring.rabbit.publisher-returns: true
2.在上面的配置类中在实现一个接口:RabbitTemplate.ReturnsCallback
1.重写returnedMessage(returnedMessage returned) 消息从exchange到 routeKey是否失败
2.在initRabbitTemplate()方法中,添加rabbitTemplate.setReturnsCallback(this::returnedMessage)
消费者确认(ACK):
1.三种确认方式:
1.不确认:消息队列中的消息一旦被消费者接收就会删除.不建议使用.
2.自动确认:消费者自动应答,处理成功发出ack,处理失败发出nack,只有消息队列收到ack才会删除,但是容易出出现死循环,一直失败,一直重新消费消息,这种情况的解决方案是:设置失败重试次数或改为手动确认.
(1)开启失败重试的限制(默认是无限制重试):消费指定次数后,消息就删除了
3.手动确认:
需要认为调用channel.basiAck手动签收,或者channel.basicNack(),让其重发消息.
消费端限流:
设置限流的原因:当rabbitMQ中堆积了很多消息后,消费端启动时,默认全部拉取过来,就有可能造成数据量大,但处理能力不够,造成系统宕机.
设置方式:300-500较合适
TTL(存活时间/过期时间):
RabbitMQ可以对消息或队列设置过期时间,如果超过这个时间,消息没有被消费,那么就会自动删除.
控制台设置队列过期时间:常用,因为队列是先进先出,在最前面的普通消息没有被消费时,即使设置了过期时间的消息过期时间到了也不会删除.所以不推荐使用设置消息过期时间.设置队列过期时间,可以保证消息在同一时间同步删除.如果同时设置消息和队列的过期时间,则以时间短的为准删除消息.
控制台设置消息过期时间:
代码方式设置队列的过期时间:
代码方式设置消息的过期时间:
死信队列:当消息成为死信消息时,可以被重新发送到另一个死信交换机,然后再由死信交换机发送给对应队列.
消息成为死信的情况:
1.队列消息长度达到限制: 长度包括1.队列可存放消息的个数 2.队列可存放消息的大小
2.消费者拒接消费消息: 1.设置消息不重回队列 2.消费者拒绝接受消息
3.当消息到达过期时间后未被消费
设置死信队列绑定死信交换机: 死信交换机和队列就是普通交换机和队列,只不过需要和一个队列绑定.
代码实现:
1.创建死信交换机,死信队列,死信路由key.
2.把可能出现死信的队列设置死信交换机和死信路由key参数
延迟队列:消息进入队列后不会被立即消费,而是到达指定时间后才会被消费.(目前rabbitMQ没有提供这个功能)
使用场景:1.下单后,30分钟未支付,取消订单,回滚库存. 2.新用户注册成功7天后,发送短信问好.
实现方式:1.定时器 2.延迟队列
虽然RabbitMQ没有提供延迟队列,但是可以使用TTL+死信队列组合实现.
rabbitMQ应用问题:
1.消息幂等性处理:幂等性指一次和多次请求某一个资源时,对于资源本身应该具有同样的结果.在MQ中指,消费多条相同的消息,得到与消费一次相同的结果.
实现方式:1.乐观锁 在表中添加version字段 2.redis方式 分布式锁:如果出现重复消费,就利用redis的setnx设置分布式锁 一个key
RabbitMQ-基础知识总结相关推荐
- RabbitMQ基础知识详解
RabbitMQ基础知识详解 2017年08月28日 20:42:57 dreamchasering 阅读数:41890 标签: RabbitMQ 什么是MQ? MQ全称为Message Queue, ...
- RabbitMQ基础知识介绍、RabbitMQ的安装
RabbitMQ基础知识介绍 官方解释:MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过 读写出入队列的消息 ...
- 消息队列RabbitMQ基础知识详解
一: 什么是MQ? MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序或者模块对模块的通信方法.MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另 ...
- SpringCloud系列知识快速复习 -- part 1(SpringCloud基础知识,Docker,RabbitMQ)
SpringCloud知识快速复习 SpringCloud基础知识 微服务特点 SpringCloud常用组件 服务拆分和提供者与消费者概念 Eureka注册中心 原理 Ribbon负载均衡 原理 负 ...
- 服务器部署基础知识_我在生产部署期间学到的知识
服务器部署基础知识 by Shruti Tanwar 通过Shruti Tanwar 我在生产部署期间学到的知识 (What I learned during production deploymen ...
- java培训基础知识都学哪些
很多人都开始学习java技术,觉得java语言在未来的发展前景空间非常大,事实却是如此,那么针对于零基础的同学, 学习java技术需要学哪些呢?下面我们就来看看java培训基础知识都学哪些? java ...
- IM开发基础知识补课(五):通俗易懂,正确理解并用好MQ消息队列
1.引言 消息是互联网信息的一种表现形式,是人利用计算机进行信息传递的有效载体,比如即时通讯网坛友最熟悉的即时通讯消息就是其具体的表现形式之一. 消息从发送者到接收者的典型传递方式有两种: 1)一种我 ...
- 大话RabbitMQ 基础入门
----------写在前面---------- 近些年微服务越来越火,让我也忍不住想去一窥微服务究竟,讲到微服务,就离不开分布式,而分布式,也离不开消息队列,在消息队列中,RabbitMQ可以说是比 ...
- 2021-7-19-OpenStack基础知识学习
OpenStack基础知识学习 参考文献:Wolf_Coder,百度百科 1,云计算 1.1,出现原因 由亚马逊公司提出.1.随着业务增加公司内部的服务器不够使用,进行虚拟化技术->2.随着公司 ...
- IT:后端进阶技术路线图(初级→中级→高级)、后端开发工程师(技术方向分类之后台业务开发/中间件/内核/分布式架构)基础知识简介、技术路线/技术趋势指南(如何选择自己的技术方向)之详细攻略
IT:后端进阶技术路线图(初级→中级→高级).后端开发工程师(技术方向分类之后台业务开发/中间件/内核/分布式架构)基础知识简介.技术路线/技术趋势指南(如何选择自己的技术方向)之详细攻略 目录 后端 ...
最新文章
- OCI读取单条记录(C)
- 策略模式和php实现
- 前端图片上坐标连线_前端图形学(十三)——弹跳运动的深入之傲娇的小球
- 牛客网多校联合训练1 J 	Different Integers(可持久化线段树/莫队)
- SubSonic:一个对象的引用是必需的对于非静态字段
- 11.MongoDB之副本集与Oplog
- linux安装opencv让输入密码,Linux下安装OpenCV步骤
- 威纶触摸屏485直接控制监控台达vfd-m变频器程序
- 保姆级windows下mysql数据库安装教程
- Windows10快捷键合集
- 一个阿里前端工程师的成长之路
- 将正式数据库中的表与测试库同步
- 写一个蛇型数组(蛇形填数)
- 如何优雅地使用Sublime Text
- android canvas画图gc,自定义控件绘图(Canvas,Paint,Region等)篇一
- STM32F4xx时钟配置的三种方法
- CentOS8安装QT5.12的问题
- 基于 Kintex UltraScale 系列 FPGA 的高性能 VPX 数据预处理载板(4 路 SRIO X4、 XCKU115-2FFVA1517I)
- java unsafe park_java – Unsafe.park vs Object.wait
- Redis的常用淘汰策略以及算法实现
热门文章
- get/post请求使用工具(apifox/postman/浏览器)能请求通但是java代码不行的问题解决
- Gephi简易学习[一]———— Gephi安装,并了解Gephi
- 一分钟让你知道黑白照片修复彩色软件有哪些?
- 用于Python中的进程和系统监视的跨平台库psutil
- python爬虫基本反爬
- 计算机毕业设计Java在线选课系统设计(系统+程序+mysql数据库+Lw文档)
- 简单介绍十几款常用的画架构图流程图的软件
- 3D数学系列之——从“蒙的挺准”到“蒙的真准”解密蒙特卡洛积分!
- ARM中流水线分析——以三级流水线进行分析
- 分布式锁的简介与作用