消息中间件之八股面试回答篇:一、问题概览+MQ的应用场景+RabbitMQ如何保证消息不丢失(生产者确认机制、持久化、消费者确认机制)+回答模板

问题概览

在这里插入图片描述
目前主流的消息队列技术(MQ技术)分为RabbitMQ和Kafka,其中深蓝色为只要是MQ,一般都会问到的问题。浅蓝色是针对RabbitMQ的特性的问题。蓝紫色为针对Kafka的特性的问题。

MQ的应用场景

MQ主要提供的功能为:异步 解耦 削峰 。
展开来讲就是

  • 异步发送(验证码、短信、邮件…)
  • MYSQL和Redis/ES之间的数据同步
  • 分布式事务
  • 削峰填谷

RabbitMQ如何保证消息不丢失

RabbitMQ的工作流程应该如下,其中每个环节都可能导致消息丢失。
在这里插入图片描述
publisher叫做发布者,也可叫做生产者。consumer叫做消费者。

生产者确认机制(解决消息未到达交换机或队列的问题)

生产者确认机制是用来确认生产者将消息发送给交换器,交换器传递给队列的过程中,消息是否成功投递的。发送确认分为两步,一是确认是否到达交换器,二是确认是否到达队列。
在这里插入图片描述
如果没有成功到达交换器,那么就会返回一个nack publish-confirm
如果没有成功到达队列,那么就会返回一个ack publish-return

那确认消息发送失败之后如何处理捏?
一般有以下三种做法:

  • 回调方法即时重发
  • 记录日志
  • 保存到数据库然后定时重发,成功发送后即刻删除表中的数据

持久化技术(解决消息在队列中丢失的问题)

MQ默认是内存存储消息,需要持久化。分为交换机持久化、队列持久化和消息持久化,都通过代码来完成。
在这里插入图片描述

消费者确认机制(解决消息未到达消费者的问题)

RabbitMQ支持消费者确认机制,即:消费者处理消息后可以向MQ发送ack回执,MQ收到ack回执后才会删除该消息。而SpringAMQP则允许配置三种确认模式:

  1. manual:手动ack,需要在业务代码结束后,调用api发送ack。
  2. auto:自动ack,由spring监测listener代码是否出现异常,没有异常则返回ack;抛出异常则返回nack
  3. none:关闭ack,MQ假定消费者获取消息后会成功处理,因此消息投递后立即被删除。
    在实际生产场景中使用的是auto模式。
    如果确认消息丢失了怎么办捏?
    我们可以利用Spring的retry机制,在消费者出现异常时利用本地重试,设置重试次数,当次数达到了以后,如果消息依然失败,将消息投递到异常交换机,交由人工处理。

常见问题和回答模板

RabbitMQ如何保证消息不丢失?

回答:(背熟以下回答大概用时2min)

RabbitMQ分别提供了三个机制,第一个是生产者确认机制,用来保证消息成功到达交换机,且成功到达队列。第二个是持久化机制,用来保证消息不在队列中丢失。第三个是消费者确认机制,用来保证消息成功到达消费者。通过以上三种机制可以综合保证消息不丢失。

首先是生产者确认机制,如果消息未能成功到达交换机,那么就返回nack publish-confirm,如果消息未能成功到达队列,那么就返回ack publish-return。通过返回的信号不同,我们可以判断具体是哪个环节出了问题并采取对应手段,譬如:用回调方法即使重发或者保存到数据库然后定时重发等。

然后是持久化机制,因为MQ是基于内存的存储,所以我们需要持久化来保证消息不会在队列中丢失。我们一共需要持久化三部分,分别是交换机、队列和消息本身,都是通过代码完成的。

最后是消费者确认机制,只有消费者接受到消息并返回ack信号后,RabbitMQ才会删除该消息。框架一般支持自动确认、手动确认和不确认三种模式。我们一般选的都是自动确认。如果确认发现消息在这个环节丢失,那么也会有相应的retry机制。

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

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

相关文章

Linux shell编程学习笔记42:hdparm命令

ChatGPT 和文心一言哪个更好用? 从智能回复、语言准确性、知识库丰富度等方面比较,两大AI助手哪个更胜一筹?快来和我们分享一下你的看法吧~ 0 前言 获取硬盘序列号是信息资产管理和信息安全检测中经常要收集的信息,对于Linux来说…

Unity - 将项目转为HDRP

Camera window -> Package Manager 之后会出现HDRP向导窗口,均点击修复。 在Edit中,更改项目中的材质

景联文科技大模型数据集更新!教育题库新增高质量数学题、逻辑推理题及英文题

苏格拉底曾以“点燃火焰”的理念来诠释教育。随着大语言模型在教育中的不断应用,教育与AI的深度融合,让我们看到了“点燃火焰”的理念的更多可能性。 大语言模型可以通过与学生的互动,为他们提供个性化的学习体验,更好地满足学习需…

目标检测数据集 - MS COCO

文章目录 1. 数据集介绍2. 使用pycocotools读取数据3. 验证mAP 论文:Microsoft COCO: Common Objects in Context 网址:https://arxiv.org/abs/1405.0312 官网:https://cocodataset.org/ 1. 数据集介绍 MS COCO是一个非常大型,且…

音频特效SDK,满足内容生产的音频处理需求

美摄科技,作为音频处理技术的佼佼者,推出的音频特效SDK,旨在满足企业内容生产中的音频处理需求。这款SDK内置多种常见音频处理功能,如音频变声、均衡器、淡入淡出、音频变调等,帮助企业轻松应对各种音频处理挑战。 一…

网安培训第二期——sql注入+中间件+工具

文章目录 宽字节注入插入注入二次注入PDO模式(动态靶机!!!!!!!)sql注入读取文件sql注入导出文件linux命令 10.12笔记sqlmapsqlmap参数 10.13笔记sqlmap 文件读写前后缀常用tamper及适用场景 10.…

【Java】SpringMVC路径写法

1、多级路径 ✅类路径和方法路径都可以写成多级 ✅其中,类路径写在方法路径前面 ✅与Servlet不同,SpringMVC中写不写“/”都可以 RequestMapping("/hello/t1") RestController public class HelloSpring {RequestMapping( value "world…

不学前沿技术与朽木浮草何异 ?Java11新特性

不学前沿技术与朽木浮草何异 ?Java11新特性 于 2018 年 9 月 25 日正式发布,这是很重要的一个版本!Java 11 和 2017 年 9 月份发布的 Java 9 以及 2018 年 3 月份发布的 Java 10 相比,其最大的区别就是:在长期支持(Lo…

013:获取K线图,增加周期可选

改进《001:如何获取A股个股的前复权K线数据》,增加周期可选。 代码: import tkinter as tk from tkinter import messagebox from tkcalendar import Calendar import pandas as pd import requests from urllib.parse import urlencodedef gen_secid(…

Docker:6种网络配置详解浅介

在Docker中,网络配置是一个重要的主题,因为容器需要与其他容器或外部网络进行通信。Docker提供了多种网络模式和配置选项,以便在不同的场景下满足用户的需求。 本文介绍这些网络模式的区别以及配置,相信看完以后你能够掌握Docker网…

16、Kafka ------ SpringBoot 整合 Kafka (配置 Kafka 属性 及对应的 属性处理类 解析)

目录 配置 Kafka 及对应的 属性处理类配置KafkaKafka配置属性的约定代码演示生产者相关的配置消费者相关的配置 代码(配置文件)application.properties 配置 Kafka 及对应的 属性处理类 配置Kafka spring.kafka.* 开头的配置属性,这些属性将由…

写作的金字塔原则

起源 芭芭拉明托 (Barbara Minto) 是 20 世纪 70 年代麦肯锡公司培训主管,她创立了金字塔原则。1963 年从哈佛商学院毕业后,明托加入了麦肯锡公司。在前往该公司位于巴黎和杜塞尔多夫的办公室出差时,她遇到了与她在美国和英国见过的同样的写作…

用的到的linux-Day1

前言: 从入门IT开始我们知道Linux操作系统与其他操作系统不同,Linux因为其独特的优势,被广泛应用在服务器领域,而且是一个近乎完美的操作系统,运行稳定、功能强大、安全性高、开源、可定制等等。 因此我打算从24年开始…

爬虫(一)

1. HTTP协议与WEB开发 1. 什么是请求头请求体,响应头响应体 2. URL地址包括什么 3. get请求和post请求到底是什么 4. Content-Type是什么1.1 简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于万维网(…

力扣面试题 16.24. 数对和(双指针)

Problem: 面试题 16.24. 数对和 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 若本题目直接双循环暴力求解会超时,可以利用排序 双指针进行优化,具体: 1.对原数组进行升序排序; 2.双指针指向排好序的数组的头尾(…

【方法】如何打开7Z格式压缩文件?

7Z是一种常见的压缩文件格式,那遇到7Z压缩文件,要如何打开呢? 想要打开7Z压缩包,需要用到解压缩软件,比如WinRAR、7-Zip等软件。安装软件后,只需要用鼠标双击7Z压缩包,就可以打开压缩包&#x…

基于SSM的蛋糕甜品店管理系统(有报告)。Javaee项目。ssm项目。

演示视频: 基于SSM的蛋糕甜品店管理系统(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring…

支付宝推出新年“五福节”活动,新增四大AI玩法;大型语言模型综合指南

🦉 AI新闻 🚀 支付宝推出新年“五福节”活动,新增四大AI玩法 摘要:支付宝宣布今年的“集五福”活动升级为“五福节”,新增了四大AI玩法:飙戏小剧场、时空照相馆、会说话红包和大家来找福。用户可以通过拼…

RUST笔记 FireDBG| Rust 代码调试器

安装https://firedbg.sea-ql.org/blog/2023-12-12-introducing-firedbg/ 更新VSCODE sudo dpkg -i code_1.85.2-1705561292_amd64.deb 安装FireDBG binaries (base) pddpdd-Dell-G15-5511:~$ curl https://raw.githubusercontent.com/SeaQL/FireDBG.for.Rust/main/install.sh …

dataGrip连接数据库mysql和intersystems的iris

文章目录 前言创建新项目选择对应的数据库产品类型新建数据库资源连接sql命令窗体手动配置本地驱动 前言 intersystems公司的产品iris是cache的升级版本,目前绝大多数数据库工具都没法连接这个数据库 datagrip下载地址 https://download-cdn.jetbrains.com.cn/da…