八股训练--RabbitMQ

一、经典问题

1.为什么要用MQ?

MQ的作用主要是3个,

  第一个是流量削峰:当某个活动举行时,访问量可能是平时的几百倍,可能一下会把服务器弄崩溃,所以通过MQ的形式,引入中间者,客户端将请求都发到MQ这里,服务器根据自身的容量去MQ中取请求进行处理,这样起了流量削峰的作用。

  第二个是应用解耦:当一个应用中有许多系统,订单系统,库存系统,支付系统等,任何一个子系统出现了故障,都会造成下单操作的故障,引入了MQ之后,一个子系统故障了,另外的子系统仍然可以进行相应的操作。

  第三个是异步处理:当A调用了B方法之后,B方法要执行很久,但A还有许多方法还要执行,就可以使用MQ进行异步的方式执行B方法,A继续执行其他方法,之后B方法执行完成之后就通知A一次,就节省了运行时间。

2.常见MQ的区别

区别RabbitMQRocketMQKafKa
语言ErlangJavaScala & Java
支持语言

几乎支持所有语言

Java,C++不成熟多种语言
单机吞吐量万级3十万级1十万级2
消息延迟微秒级毫秒级毫秒以内
可用性高,基于主从架构非常高,分布式结构非常高,分布式结构,一个数据多个副本
消息可靠性  - 可以做到零丢失可以做到零丢失
优势支持所有语言,吞吐量万级,功能齐全接口简单易用,吞吐量大,分布式使用方便超高吞吐量,ms的延迟,可用性有保障
劣势吞吐量较低,erlang语言不易定制开发,二次开发

只支持Java和C++,C++还不成熟

有可能进行消息的重复消费
应用都有使用大规模,复杂的业务大数据的实时计算和日志采集

3.RabbitMQ各组件功能

1.Server:接收客户端的连接,实现AMQP的实体服务。

2.Connection:连接,应用程序和Server的网络连接,TCP连接

3.Channel:一个信道中有多个Connection,减轻了TCP connection的开销

4.Message:消息

5.VirtualHost:虚拟主机,可以有多个,一个虚拟主机里面有许多交换机和队列,但名称不能相同

6.交换机:按照路由规则将消息映射到对应的队列中。如果路由不到,就返回给消费者或者直接丢弃,常见类型有direct,fanout,topic,headers四种

7.队列:保存消息,给消费者消息

8.绑定:交换机和队列之间的路由规则

4.RabbitMQ的工作原理

  生产者连接到Server,并开启一个信道,建立许多连接,生产者将消息发送给broker server,然后brokersever根据virtualhost中的交换机和队列的路由规则保存在队列中,消费者和中间者建立连接了之后,从队列中取消息进行一定的消费。

5.RabbitMQ的工作模式

1.simple模式:

  生产者将消息直接发送到队列中,消费者监听队列中存在消息,就直接取出消费掉,队列之后将消息删除。

  隐患:消息可能没有被消费者正确处理,但队列仍然将消息删除了,造成了消息的丢失,这时候设置手动的ack比较合适。

2.work Queues模式:

  生成者将消息发送到队列中,有多个消费者去抢夺这个消息,多并发的情况下就设置一个开关,保证消息只能被一个消费者消费

3.publish/subscribe发布订阅模式

  消费者监听队列,生产者将消息发给broker,由交换机将消息转发到绑定每个交换机的每个队列,每个绑定交换机的队列都会收到消息

4.routing路由模式

  只有当交换机和队列的key能够匹配之后,交换机才将消息转发到对应的队列中,之后绑定队列的消费者才能消费

5.topic主题模式(路由模式的一种)

  存在模糊匹配的方式

6.RabbitMQ消息丢失的情况有哪些?

1.生产者发送消息到broker server时发生丢失

2.broker server 存储的消息丢失

3.broker server 存储的消息分发给消费者时丢失

7.消息丢失的原因和解决方法

1.生产者发送消息到broker server时发生丢失:

  原因:1.发送过程中存在网络问题   2.代码本身逻辑问题

  解决方法:发送方确认机制(publisher confirm):生产者将信道设置成confirm模式,一旦信道进入这个confirm模式,信道上面的消息就会被指派一个唯一id,一旦消息被投递到队列中,broker就会返回一个确认消息给生产者(包含消息的唯一id),这就确保了消息的成功传递(confirm模式最大的好处就是它是异步的,一旦发布了一条消息,生产者可以继续发送消息,消息被确认了之后,生产者会调用回调方法来确认,如果broker server因为自身错误丢失了消息就会返回一个nack,生产者之后再重新做相应的处理)

  发布确认的情况:

1.单独发布确认:一条消息只有被确认了之后,才能继续发送消息,如果指定时间没有返回确认信息就会抛异常

2.批量发布确认:一次性发布一批消息,但如果发送故障导致发布出现问题之后,就无法知道是哪个消息出现了问题,就导致需要重新发一整批消息,同步操作,会阻塞消息的发布

3.异步发布确认:逻辑虽然比前两个复杂,但是因为异步提高了许多效率,将消息的确认异步处理,发送消息之后仍然可以继续发送消息。

  还可以使用AMQP的事务处理,但是这样的方式效果不是特别的好,因为这个事务是同步的,一旦有一条消息丢失了之后,就会阻塞整个发送的过程。跟单独发布类似了

2.Broker Server 中存储的消息丢失:

原因:消息没有持久化,服务器重启的时候导致消息丢失

  解决方式:1.消息回退:通过设置mandatory参数可以在当消息传递过程中不可达目的地时将消息返回给生产者。对于这些无法路由的消息就设定一个备份交换机,然后将消息存储到备份交换机的队列中,这时候之后就手动地对这些队列中的消息进行处理

  2.设置持久化:当MQ接收到消息的时候,通过持久化的方式将消息存储到硬盘中

3.RabbitMQ 发给消费者时消息丢失:

原因:1.消费者接收到消息之后,还没来得及处理消息,消费者机器就宕机了

2.处理消息存在异常

解决方案:默认采用了自动应答的方式,要想消息在消费过程中不丢失,需要把手动应答转换成自动应答。

8.RabbitMQ消息基于什么传输

  由于TCP连接的创建和销毁开销较大,且并发数会受到系统资源的限制,RabbitMQ采用信道的方式来传输数据。信道是建立在真实的TCP连接内的虚拟连接,每个tcp上的信道数量是没有限制的。

9.RabbitMQ支持消息幂等性?

  支持的,当生产者给mq发送一条消息的时候,mq内部都会生成一个inner-msg-id,作为去重的依据(消息投递失败并重传),防止重复的消息进入队列。消费同理,要求消费体中必须要有一个bizid,避免一条消息被重复消费。

10.RabbitMQ消息持久化的条件

1.声明队列必须设置为持久化durable设置为true

2.消息推送投递模式必须设置持久化,deliveryMode设置为2(持久)

3.消息到达持久化的交换机

4.消息到达持久化的队列

11.RabbitMQ死信队列的介绍

定义:由于一些原因导致queue种的某些消息无法被正常消费,这些消息没有后续的处理,就变成了死信消息

来源:消息TTL过期,(队列达到最大值,消息无法加入到队列中),消息被拒绝

用处:用于实现延迟队列

12.RabbitMQ延迟队列的介绍

用来存放在指定时间被处理的队列

使用场景:

1.订单在10分钟内未支付自动取消

2.用户注册之后,3天没有登录就发短信提醒

3.用户发起退款,3天内商家没有处理,就直接通知运营人员

4.预定会议后,开始前10分钟通知各个人员进行参会

实现条件:1.消息设置TTL  2.存在死信队列

13.RabbitMQ如何处理消息堆积

  当出现消息挤压之后,先处理宕机的消费者,然后创建原先N倍的队列,将堆积的消息都轮询到这些队列中,然后再创建N倍的消费者,每一个消费者对应一个队列,快速地把堆积的消息给消费了之后,恢复到原来的模式。(这种做法就相当于临时将queue的资源和消费者的i资源扩大了N倍,消费的速度也变为了N倍)

14.RabbitMQ如何处理消息中丢失的数据

  在流量的低峰期的时候,写一个程序去手动查询那些丢失的信息,然后将消息重新发送到mq中,让消费者进行消费

15.RabbitMQ如何处理长时间未处理导致写满的情况?

  和上面的情况类似,先写一个程序直接去MQ中消费消息,消费一个就丢弃一个,先降低MQ的压力,等到流量低峰期时,就去手动地查询丢失的数据

16.如何设计一个消息队列

这个问题可以观看我以前的博客:Java项目--仿RabbitMQ的消息队列_04Koi.的博客-CSDN博客

这里面详细讲解了如何简单设计一个消息队列,感谢观看!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/90613.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/90613.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch 文档检索系统

学习笔记:Elasticsearch 文档检索系统 1. 技术栈与核心组件 Node.js:后端运行环境,适合构建高性能 Web 服务。Express:Node.js 的 Web 框架,简化 API 开发。Elasticsearch:分布式全文检索引擎,支…

如何准确查看服务器网络的利用率?

在服务器运维与性能调优过程中,网络利用率是一个不容忽视的关键指标。它反映了服务器带宽资源的实际使用情况,是判断系统瓶颈、规划资源扩展、排查连接问题的重要依据。很多人误以为网络是否正常只要“能上网”或“Ping得通”就可以了,实际上…

掌握Spring声明式事务传播机制:AOP与ThreadLocal的协同工作

声明式事务的传播机制是解决多个事务方法嵌套调用时,事务如何创建、复用、挂起或隔离的核心逻辑。它的实现依赖于事务管理器、事务状态管理、线程上下文绑定等组件的协同,本质是通过一套 “规则判断 状态维护” 的逻辑,在方法调用时动态决定…

@Transactional事务注解的批量回滚机制

关键机制说明:1.​​事务注解生效​​:Transactional(rollbackFor Exception.class)Override Transactional(rollbackFor Exception.class) public Boolean saveUser(UserDTO userDto) {SysUser sysUser new SysUser();BeanUtils.copyProperties(user…

飞算 JavaAI 深度体验:开启 Java 开发智能化新纪元

个人主页:♡喜欢做梦 欢迎 👍点赞 ➕关注 ❤️收藏 💬评论 目录 一、引言 二、飞算 JavaAI 初印象与功能概览 (一)初识飞算 JavaAI (二)核心功能模块概览 三、智能代码生成功能深度体…

pandas销售数据分析

pandas销售数据分析 数据保存在data目录 消费者数据:customers.csv商品数据:products.csv交易数据:transactions.csv customers.csv数据结构:字段描述customer_id客户IDgender性别age年龄region地区membership_date会员日期produc…

访问Windows服务器备份SQL SERVER数据库

以前没有直接访问过Windows服务器,今天刚一看到的是时候有点懵,竟然下意识的使用SecureCRT远程工具去连了一下,然后领导说,看一下用户名,突然意识到,跟我们平时远程桌面是一样的。 一、 win + R 打开命令窗口 二、 输入 mstsc 三、 输入远程地址 四、点击连接,如果有弹…

C++ 面向对象 - 对象定义方法汇总

C对象定义方法汇总 1. 栈上定义方式 1.1 调用无参构造函数的定义方式 无参构造函数有两种: 默认无参构造函数Demo(){}默认值列表构造函数。Demo():a{1},b{2}{} // 使用初始化列表实现对象定义方式: Demo d; Demo d1{}; // 以下定义方式还调用了拷贝构造…

指尖上的魔法:优雅高效的Linux命令手册

一、Linux基础指令 1. ls ls:对于目录,列出该目录下的所有子目录与文件,对于文件,将列出文件名以及其他信息。 -a:列出目录下的所有文件,包含以.开头的隐藏文件 -l:列出文件的详细信息 -d:将目录…

《磁力下载工具实测:资源搜索+高速下载一站式解决方案》

嘿,朋友们!我是阿灿,今天给大家带来一个超实用的看片神器,特别适合老司机们使用,保证让你眼前一亮!推荐一款比某雷更好用的下载工具,搭配资源搜索神器,轻松获取资源不限速。超强磁力…

Go网络编程基础:网络模型与协议栈概述 - 从理论到实践的完整指南

1. 引言 在当今的互联网时代,网络编程已经成为后端开发的核心技能。Go语言以其出色的并发性能和简洁的语法,在网络编程领域展现出了强大的优势。从Docker、Kubernetes到众多微服务框架,Go已经成为构建高性能网络应用的首选语言之一。 你是否…

Web攻防-SSTI服务端模版注入利用分类语言引擎数据渲染项目工具挖掘思路

知识点: 1、WEB攻防-SSTI-利用分类&功能点 2、WEB攻防-SSTI-利用项目&挖掘思路 SSTI(Server Side Template Injection) 服务器模板注入, 服务端接收了用户的输入,将其作为 Web 应用模板内容的一部分,在进行目标编译渲染的过程中&…

李沐动手学深度学习Pytorch-v2笔记【07自动求导代码实现】

文章目录前言自动求导实现非标量变量的反向传播分离计算Python控制流的梯度计算前言 关于走动求导的理论知识个人有点难以理解,推荐大家去看https://blog.csdn.net/weixin_42831564/article/details/135658138这篇文章,讲的很好。 自动求导实现 impor…

strchr 与 strstr 函数详解

一.strchr - 字符查找函数1.函数原型char *strchr(const char *str, int c);2.核心功能在字符串中查找特定字符的第一次出现位置3.参数说明参数 类型 说明str const char* 要搜索的字符串c int 要查找的字符(自动转换为char)4.返回值…

jakes信道模型

Jakes 模型 前面我们介绍了多径信道合成信号可表示为: r(t)Re{∑i0N(t)−1ai(t)u(t−τi(t))ej2πfc(t−τi(t))ϕDi(t)} r(t)Re \left\{\sum_{i0}^{N(t)-1}a_{i}(t)u(t-\tau_{i}(t))e^{j2\pi f_{c}(t-\tau_{i}(t))\phi_{D_{i}}(t)} \right\} r(t)…

JVM类加载机制解析

什么是类加载器? 类加载器是JVM的核心组件之一,负责将Java字节码文件(.class文件)加载到JVM内存中。由于JVM只能执行二进制字节码,类加载器的作用就是将编译后的.class文件转换为JVM可以理解和执行的格式,使…

用Python和OpenCV从零搭建一个完整的双目视觉系统(二)

本系列文章旨在系统性地阐述如何利用 Python 与 OpenCV 库,从零开始构建一个完整的双目立体视觉系统。 本项目github地址:https://github.com/present-cjn/stereo-vision-python.git 项目架构设计:蓝图、分工与工作流 在上一篇文章中&#…

亿级流量下的缓存架构设计:Redis+Caffeine多级缓存实战

亿级流量下的缓存架构设计:RedisCaffeine多级缓存实战 一、为什么需要多级缓存? 在亿级流量场景下,单纯依赖Redis会遇到三大瓶颈:网络延迟:Redis远程访问通常需要1-5ms,QPS超过10万时成为瓶颈资源成本&…

AI基建还能投多久?高盛:2-3年不是问题,回报窗口才刚开启

高盛表示,尽管AI商业化变现仍处早期阶段,但基于成本削减的第一阶段回报已经显现。预测到2030年AI自动化可为财富500强企业节省约9350亿美元成本。分析师认为,这一早期收益足以支撑当前AI基础设施投资水平,尽管增长率可能放缓。虽然…

【mac】快捷键使用指南

在Mac上,根据选择对象的不同,在选择时移动的方法也有所不同,以下是具体介绍: 移动文件或文件夹:可通过拖放操作移动。打开“访达”(Finder),找到要移动的文件或文件夹,按…