初级面试问到rabbitMQ,看这一篇文章就够了!

news2024/11/24 20:26:46

一、rabbitMQ的基础要点回顾

1.使用场景

1)解耦:使用消息队列避免模块间的直接调用。将所需共享的数据放在消息队列中,对于新增的业务模块,只要对该类消息感兴趣就可以订阅该消息,对原有系统无影响,降低了各个模块的耦合度,提供系统的扩展性。

2)异步:消息队列提供了异步处理机制,在很多时候应用不需要立即处理消息,允许应用把一些消息放入中间件,在之后需要的时候慢慢处理。

3)削峰:高峰期的消息可以被挤压下来,在随后的时间里进行平滑处理,不至于让系统短时间内过载而崩溃。

2.基本概念

二、MQ工作过程

1.如何工作

 

 2.集群模式

如下所示,所有操作要定位到master队列进行

三、rabbitMQ的特性分析

1.特性分析

消息路由

支持

不同交换器支持不同的消息路由

消息有序

不支持

消费失败,放回队列重新消费将导致消息无序

消息时序

非常好

支持过期时间、延期时间设定

容错处理

非常好

交付重试和死信队列

伸缩

一般

受限于只有一个master queue

持久化

不太好

消费过的消息会被立即删除

消息回溯

不支持

消息不支持永久保存

高吞吐

中等

请求的执行最后都是在master queue,单机性能达不到十万

2.技术选型

指标\选择

Kafka

RocketMQ

RabbitMQ

单机吞吐量

17.3w/s

11.6w/s

2.6w/s(持久化)

开发语言

Scala/Java

Java

Erlang

主要维护者

Apache

Alibaba

Mozilla/Spring

订阅形式

基于topic,按照topic进行正则匹配的发布订阅模式

基于topic/messageTag,按照消息类型和属性进行正则匹配的发布订阅模式

提供了4种:direct、topic、headers和fanout(广播模式)

持久化

支持大量堆积

支持大量堆积

支持少量堆积

顺序消息

支持

支持

不支持

集群方式

无状态集群

多对Master-Slave

简单集群,复制模式

性能稳定性

较差

一般

四、rabbitMQ实践中可能遇到的问题

1.消息处理过程

1)生产者将消息投递到队列:如果消息设置了持久化属性,将会被写入磁盘,落盘成功后,重启不会导致消息丢失。

2)RabbitMQ将消息传递给消费者:队列收到的消息将以轮询的分发方式发送给消费者。自动应答模式下会立即将消息标记为删除,手动应答模式下。

3)消费者处理消息:手动应答模式下在消息处理之后告诉RabbitMQ可以把该消息删除了。

消费者可以通过设置预取计数值来调整通道上允许的未确认消息的最大数量。

2.顺序消费问题

1)一个队列有多个消费者消费:例如不同订单号的消息消费完成时间不同导致顺序丢失,此时我们可以创建多个队列,每个消费者只消费一个队列,生产者把订单号相同的消息投递到同一个队列(最简单的就是两边都采用除余法),这样同一个订单号的消息就只会被同一个消费者顺序消费。

 2)消费者程序内部进行了多线程消费:无法保证哪个线程先执行完,导致顺序错乱。针对这种情况,线程可以不直接消费消息而是把同一个订单号的消息放入同一个内存队列,然后线程再从内存队列中取出消息进行消费。

3)生产者到MQ的过程中出现了错乱:消息在投递时由于网络延迟或者错误重试导致顺序错乱。针对这种情况需要在消费时做一个乱序处理,比如对同一个订单进行插入、修改、删除操作分别标记消息ID为1、2、3,将消息按照消息ID大小从小到大进行排序,每消费一个消息就将消息ID记录在缓存中,如果遇到消息ID更小的消息就丢弃。

3.消息丢失问题

1)生产者在将消息发送到MQ的过程中数据丢失:传输过程因为网络等原因造成的数据丢失可以采用以下解决办法:

①RabbitMQ提供的事务功能,如果消息没有被MQ接收到,生产者会报错并回滚事务尝试重新发送,缺点是同步阻塞操作会大幅降低性能。
②发送方确认机制,只要消息到达MQ就会触发confirmCallback,表示服务器成功接收到信息。如果交换机没能成功将消息投递到队列,就会触发returnCallback。

2)断电导致消息丢失:开启持久化可以将消息持久化到磁盘,如果同时开启了发送方确认则写入成功后才会回复发送方ack,如果没有收到ack回调,也会重发消息。

3)消费者服务在消费时宕机:针对这种情况,可以开启MQ的消费端确认机制。首先关闭MQ的自动ack,在确保消息处理完成之后再手动ack,如果服务宕机或者程序异常,消息会重新入队。

4.重复消费问题

重复消费的原因:MQ回复的确认消息因为宕机或者网络原因未被队列收到,这时消息将会被再次分发。

解决办法(选择其一即可):

1)消费者的业务逻辑接口设计成幂等的,比如在缓存中查询是否已消费过此消息。

2)将消息记录在数据库,每次查询该防重表。

3)使用唯一键,保证不会插入多条重复数据。

5.消息积压问题

1)消费者宕机:检测MQ队列消息积压

2)生产者投递频率超出消费者处理能力:可以限制生产者的发送或者上线更多消费者

 

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

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

相关文章

防范化解灾害风险,科技筑牢安全城墙

气象灾害:大气圈变异活动会对人类生命财产和国民经济及国防建设等造成的直接或间接损害。我国气象灾害种类繁多,不仅包括台风、暴雨、冰雹、大风、雷暴、暴风雪等天气灾害,还包括干旱、洪涝、持续高温、雪灾等气候灾害。此外,与气…

Docker中部署监控

Docker概念 一、部署Prometheus+grafana环境 1.1 、部署Prometheus+grafana环境 docker pull registry.cn-hangzhou.aliyuncs.com/lhrbest/lhrprometheus:1.0 docker tag registry.cn-hangzhou.aliyuncs.com/lhrbest/lhrprometheus:1.0 lhrbest/lhrprometheus:1.01.2 、创建镜…

【分布式事务】Seata 之 @GlobalTransactional 在TM侧的核心逻辑

文章目录 一、概述二、GlobalTransactional核心逻辑三、GlobalTransactional核心源码解读四、事务能力的启停运行期的开关变更 一、概述 Seata 依赖 Spring 的注解机制,实现声明式事务,即开发者给 Bean 使用GlobalTransactional注解 ,Seata …

深度学习03-卷积神经网络(CNN)

简介 CNN,即卷积神经网络(Convolutional Neural Network),是一种常用于图像和视频处理的深度学习模型。与传统神经网络相比,CNN 有着更好的处理图像和序列数据的能力,因为它能够自动学习图像中的特征&…

GIS 根据投影坐标点获取投影坐标所属的投影坐标系EPSG

什么是EPSG? EPSG(The European Petroleum Survey Group,官网 http://www.epsg.org/)维护着空间参照对象的数据集,OGC标准中空间参照系统的SRID(Spatial Reference System Identifier)与EPSG的空间参照系统ID相一致。…

冒泡数组实现和冒泡数组的改进以及插入法排序

概念 在数组排序的过程中&#xff0c;每次比较相邻的两个数&#xff0c;并且把大的数放在后面 例如{1&#xff0c;3&#xff0c;5&#xff0c;7&#xff0c;9&#xff0c;2&#xff0c;4&#xff0c;6&#xff0c;8&#xff0c;10} 实现 #include<iostream> using names…

修改ro.debuggable用于调试安卓应用

一.Root 网上有很多root教程,这里推荐: 玩机必看&#xff01;带你入坑安卓刷机&#xff0c;小白也能看懂的ROOT基础指南来啦&#xff01; 很详细的介绍了Root的原理和方法,强烈推荐使用Magisk工具 可以使用命令adb shell getprop ro.debuggable查看ro.debuggable的值 二.Magi…

[MYSQL / Mariadb]数据库学习-表结构、键值(普通索引、主键、外键)

数据库学习-表结构、键值 回顾数据类型表结构字段约束条件&#xff08;限制字段赋值的&#xff09;例&#xff0c;建表并设置约束条件设置default列为0 修改表结构例添加新字段&#xff0c;并设置位置。修改字段类型change 修改字段名注意&#xff1a;在修改字段名或字段类型时…

Java中的 stop the world是什么?

一、概述&#xff1b; 从字面上讲&#xff0c;就是停止这个世界&#xff0c;看到这个字眼&#xff0c;就觉得这是可怕的事情&#xff0c;那到底什么是stop-the-world&#xff1f; stop-the-world&#xff0c;简称 STW&#xff0c;指的是 GC 事件发生过程中&#xff0c;会产生…

面试题30天打卡-day26

1、什么是 AOP&#xff1f;Spring AOP 和 AspectJ AOP 有什么区别&#xff1f;有哪些实现 AOP 的方式&#xff1f; AOP&#xff08;Aspect-Oriented Programming&#xff0c;面向切面编程&#xff09;是一种编程思想&#xff0c;可以在不修改原有业务逻辑代码的情况下&#xf…

srs 直播连麦环境搭建

一、简介 二、修改conf/rtc.conf 三、两个客户端加入房间 四、合流 4.1分别拉流尝试 4.2合流推流 4.3拉取合流 一、简介 直播连麦是指在one2one或one2many进行音视频通话&#xff0c;此时把他们的音视频流合在一起&#xff0c;通过rtmp等协议推送给大量用户做直播。 因此首选需…

Java面试(3)基础语法

基础语法 1. 标识符和关键字的区别是什么&#xff1f; 在我们编写程序的时候&#xff0c;需要大量地为程序、类、变量、方法等取名字&#xff0c;于是就有了 标识符 。简单来说&#xff0c; 标识符就是一个名字 。 有一些标识符&#xff0c;Java 语言已经赋予了其特殊的含义…

python带你用最简单嘚词云图分析出最热话题

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 平常我们爬的评论、弹幕等等&#xff0c;数量又多又密&#xff0c;根本看不过来&#xff0c; 这时候数据分析的作用来了&#xff0c; 今天我们就试试用Python根据这些数据&#xff0c;来绘制词云图进行热词分析。 目录…

JUC-线程Callable使用与FutureTask源码阅读

JUC-线程Callable使用与FutureTask源码阅读 Callable简单使用 带返回值的线程(实现implements Callable<返回值类型>)&#xff0c;使用示例 import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Fut…

STC32G12K128单片机的 moubus-rtu 主机测试工程

简介 STC32G12K128 是STC 推出的一款32位的 C251 的单片机。最近拿到一块官方申请的 屠龙刀-STC32G开发板&#xff0c;就用它的提供的库函数&#xff0c;查考安富莱提供的 modbus 例程移植了一个 modbus-rtu 主站的工程。 modbus-rtu host 移植注意点 modbus-rtu 功能配置 …

MapReduce序列化【用户流量使用统计】

目录 什么是序列化和反序列化&#xff1f; 序列化 反序列化 为什么要序列化&#xff1f; 序列化的主要应用场景 MapReduce实现序列化 自定义bean对象实现Writable接口 1.实现Writable接口 2.无参构造 3.重写序列化方法 4.重写反序列化方法 5.顺序一致 6.重写toStri…

您应该查看的5个ChatGPT WordPress插件

要创建免费网站&#xff1f;从易服客建站平台免费开始 500M免费空间&#xff0c;可升级为20GB电子商务网站 您应该查看的5个ChatGPT WordPress插件 发布于 2023年4月1日 ChatGPT 席卷了数字世界。作为内容创建者或营销者&#xff0c;您可能希望通过在您的网站上使用ChatGPT…

JimuReport - 积木报表(一款免费Web报表工具)

一款免费的数据可视化报表&#xff0c;含报表和大屏设计&#xff0c;像搭建积木一样在线设计报表&#xff01;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; Web 版报表设计器&#xff0c;类似于excel操作风格&#xff0c;通过拖拽完成报表设计。…

扫雷【C语言】

用C语言实现一个9X9的扫雷 test.c 测试部分 game.c 游戏实现部分 game.h 游戏声明部分 菜单部分 游戏部分 游戏部分包括创建一个扫雷的区域&#xff0c;在其中埋雷&#xff0c;玩家进行扫雷&#xff0c;判断扫雷是否成功 这里我i们定义行列&#xff0c;便于以后将其…

2023.05.12-使用Transformers Agents来一键调用千万个AI模型

1. 简介 简单来说&#xff0c;就是以前想要实现某一个AI功能&#xff0c;需要自己去网上搜索对应的模型、下载对应的权重才能使用。现在可以把中间的这些个环节都砍了&#xff0c;我们只需要告诉模型我们想要对某段文字或者某张图片进行什么操作&#xff0c;transformer就会自…