消息中间件之八股面试回答篇:二、MQ如何保证消息不重复消费(幂等性)+RabbitMQ死信交换机(延迟队列)+回答模板

MQ消息重复消费问题

可能出现重复消费的场景

  • 网络抖动
  • 消费者挂了

MQ通用的解决方案

  • 每条消息设置一个唯一的标识id
  • 幂等方案:【 分布式锁、数据库锁(悲观锁、乐观锁) 】

RabbitMQ的死信交换机

当一个队列中的消息满足下列情况之一时,可以成为死信(dead letter)

  • 消费者使用basic.reject或 basic.nack声明消费失败,并且消息的requeue参数设置为false
  • 消息是一个过期消息,超时无人消费。其又可以细分为两种情况(以最短的时间超时为准)
    1. 消息所在的队列设置了存活时间
    2. 消息本身设置了存活时间
  • 要投递的队列消息堆积满了,最早的消息可能成为死信

如果该队列配置了dead-letter-exchange属性,指定了一个交换机,那么队列中的死信就会投递到这个交换机中,而这个交换机称为死信交换机(Dead Letter Exchange,简称DLX)

ATT:死信交换机实际上也就是一个普通的交换机,它能在任何队列被指定,只不过赋予了接受死信的功能而已。所以需要在定义队列时就指定死信交换机。

@Bean
public Queue ttlQueue(){
	return QueueBuilder.durable("simple.queue")//指定队列名称并持久化
	.ttl(10000)//设置队列的超时时间,10秒
	.dealLetterExchange("dl.direct")//指定死信交换机
	.build();
}

RabbitMQ的延迟队列(DelayExchange)

延迟队列:进入队列的消息会被延迟消费的队列
场景:超时订单、限时优惠、定时发布

延迟队列本质还是官方的三种交换机,只是添加了延迟功能。

实现延迟队列可以用以下两种方法之一:

  1. 队列绑定一个死信交换机,在死信交换机上可以绑定其他队列,在我们发消息的时候可以按照需求指定TTL的时间。(本质上是死信交换机+TTL)
  2. 安装一个DelayExchange插件,声明一个交换机,然后设定delayed属性为true即可。

RabbitMQ官方的插件社区地址为:https://www.rabbitmq.com/community-plugins.html

不需要掌握,本人留档使用

在这里插入图片描述
在这里插入图片描述

问题与回答模板

RabbitMQ消息的重复消费问题如何解决的?

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

嗯,这个我们还真遇到过,是这样的,我们当时消费者是设置了自动确认机制,当服务还没来得及给MQ确认的时候,服务宕机了,导致服务重启之后,又消费了一次消息。这样就重复消费了

因为我们当时处理的支付(订单|业务唯一标识),它有一个业务的唯一标识,我们再处理消息时,先到数据库查询一下,这个数据是否存在,如果不存在,说明没有处理过,这个时候就可以正常处理这个消息了。如果已经存在这个数据了,就说明消息重复消费了,我们就不需要再消费了

面试官:那你还知道其他的解决方案吗?

候选人

嗯,我想想~

其实这个就是典型的幂等的问题,比如,redis分布式锁、数据库的锁都是可以的。

RabbitMQ中死信交换机或者说延迟队列有了解过嘛?

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

首先关于死信的定义,一般满足以下情况之一,就可能成为死信。譬如,过期时间到了却仍未被消费的消息,或者要投递的队列满了,最早的消息就可能成为死信。死信交换机实际上就是设置的一个用来接收死信的交换机,它与普通的交换机其实没有什么区别。
而延迟队列,一般用于超时订单、限时优惠、定时发布之类的场景。本质还是官方的三种交换机之一,只是添加了延迟功能。我们实现它可以有两种方式。第一种就相当于死信交换机加上TTL,第二种更简单一些,就是去官网下载相关的插件,然后定义时把delay设置为true即可。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

图卷积网络(GCN)

本文主要分为两部分,第一部分介绍什么是GCN,第二部分将进行详细的数学推导。 一、什么是GCN 1、GCN 概述 本文讲的GCN 来源于论文:SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS,这是在GCN领域最经典的论文…

allure生成报告展示在vue-admin前端展示

生成测试数据 本栗子测试数据根据pytest测试用例生成 首先设置pytest.ini配置信息 a l l u r e d i r alluredir alluredir代表生产allure报告数据地址 t e s t c a s e d i r test_casedir testc​asedir代表测试用例路径 [pytest] addopts -vs --alluredir $alluredir$…

【C++】c++入门,认识c++版本的Hello world!

Hello,everybody!在c语言,数据结构初阶学完之后,咱们就要开始c的学习了。关于c的语法,有很多是为了弥补c语言的不足。在咱们学习c的过程中,随着你对c语法掌握的越来越熟练。我相信你会逐渐爱上c。那我们直接进入正题。 1.c兼容c …

【taro react】 ---- 自动化【根据运行命令直接编译对应的是测试环境或正式环境】

1. 场景 开发和发布程序中遇到最常见的问题,需要一个环境配置文件,然后在启动或者编译前,需要开发者去修改对应的环境变量来控制启动或者编译的环境是测试环境还是正式环境。同时如果是需要维护小程序的 Jenkins 自动上传,就会更加的麻烦,上传的小程序越多,我们需要维护…

STM32单片机学习5--STM32中断

文章目录 一、前言二、NVIC中断控制器2.1、NVIC结构体成员2.2、抢占优先级和响应优先级2.3、NVIC的优先级组 三、EXTI外部中断四、中断实战4.1、确定连线4.2、配置中断控制端口4.3、配置中断端口4.4、配置中断服务函数4.5、主函数调用 一、前言 单片机无系统执行逻辑&#xff…

Unity之Cinemachine教程

前言 Cinemachine是Unity引擎的一个高级相机系统,旨在简化和改善游戏中的相机管理。Cinemachine提供了一组强大而灵活的工具,可用于创建令人印象深刻的视觉效果,使开发人员能够更轻松地掌控游戏中的摄像机行为。 主要功能和特性包括&#x…

Linux代码行数统计工具cloc

这里推荐个Perl语言开发的开源代码统计工具cloc,全称为Count Lines of Code。支持多平台使用、多编程语言识别。 在Ubuntu下安装cloc: sudo apt-get install cloc运行cloc可以cd到指定目录运行: cloc . # 或者例如统计src目录下的代码行数 …

微信小程序跳转第三方网站链接

很简单&#xff0c;先定义一个跳转外网的页面&#xff0c;利用 web-view 标签&#xff0c;通过src设置你要跳转的外网地址 <web-view src"https://www.baidu.com"></web-view>然后在你的跳转按钮写跳转函数即可 wx.navigateTo({url: /pages/webView/inde…

微信小程序(十一)表单组件(进阶)

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a;&#xff08;涉及内容较多&#xff0c;建议细看源码&#xff09; 1.radio-group的使用与数据处理 2.checkbox-group的使用与数据处理 3.picker的使用与数据同步处理(此处示范了地域与日期) 源码&#xff1a; form…

使用API有效率地管理Dynadot域名,使用API进行域名注册

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

国标GB28181协议EasyCVR启动失败报错“Local Machine Check Error”的解决方法

国标GB28181安防监控系统EasyCVR平台采用了开放式的网络结构&#xff0c;可支持4G、5G、WiFi、有线等方式进行视频的接入与传输、处理和分发。安防视频监控平台EasyCVR还能支持GIS电子地图模式&#xff0c;基于监控摄像头的经纬度地理位置信息&#xff0c;将场景中的整体安防布…

如何设计性能测试用例!一文1000字详解(建议收藏)

性能测试是确保软件应用在各种负载和条件下都能保持良好性能的关键活动&#xff0c;涉及到系统的响应时间&#xff0c;还包括吞吐量、资源利用率、可靠性和系统的可伸缩性。 性能测试用例设计需要对业务需求和系统行为有深刻理解&#xff0c;设计过程涉及确定测试目标、选择相…

基于无线脉冲,超宽带技术的高精度人员定位系统源码,可实现人员、物资的精准定位

随着工业4.0深入推进信息化&#xff0c;智能化&#xff0c;数据化管控成为企业不可或缺的竞争力&#xff0c;其中人员物资等实时位置信息成为变革关键&#xff0c;因此&#xff0c;uwb超宽带高精度定位系统应运而生&#xff0c;高精度的位置数据作为智能工厂数据流的重要组成部…

【EI会议征稿】第三届光电信息与功能材料国际学术会议(OIFM 2024)

第三届光电信息与功能材料国际学术会议&#xff08;OIFM 2024&#xff09; The 3rd International Conference on Optoelectronic Information and Functional Materials 第三届光电信息与功能材料国际学术会议&#xff08;OIFM 2024&#xff09;将于2024年4月5-7日在武汉召开…

编辑图片加文字的软件?分享4款!

在数字时代&#xff0c;图片和文字的结合已经成为信息传递的重要方式。为了满足广大自媒体人和内容创作者的需求&#xff0c;本文将为您推荐几款编辑图片加文字的软件&#xff0c;帮助您轻松实现创意表达。 魔法抠图大师 作为一款专业的图片编辑软件&#xff0c;还提供了多种编…

MySQL 8.3 发布, 它带来哪些新变化?

1月16号 MySQL 官方发布 8.3 创新版 和 8.0.36 长期支持版本 (该版本 没有新增功能&#xff0c;更多是修复bug )&#xff0c;本文基于 官方文档 说一下 8.3 版本带来的变化。 一 增加的特性 1.1 GTID_NEXT 支持增加 TAG 选项。 之前的版本中 GTID_NEXTUUID:number &#xff…

GPSR路由算法的MATLAB实现

GPSR基于节点地理位置路由信息&#xff0c;采用贪婪策略和右手准则的结合在邻居节点中选择下一跳节点进行数据转发。节点在进行路由选择时&#xff0c;只需知道自己、邻居和目标节点的地理位置信息&#xff0c;无需维护全局网络的链路状态&#xff0c;这在很大程度上降低了网络…

【JavaEE进阶】 MyBatis使用注解实现增删改查

文章目录 &#x1f343;前言&#x1f334;传递参数&#x1f38b;增(Insert)&#x1f6a9;返回主键 &#x1f384;删(Delete)&#x1f332;改(Update)&#x1f333;查(Select)&#x1f6a9;起别名&#x1f6a9;结果映射&#x1f6a9;开启驼峰命名(推荐使用) ⭕总结 &#x1f343…

电源模块测试项目:输入低压点循环测试及测试方法

输入低压点循环测试是什么? 电源输入低压点循环测试是检测电源在低压条件下的性能和稳定性&#xff0c;它是一次电源模块的输入欠压点保护的设置回差测试。当输入电压较低&#xff0c;接近一次电源模块欠压点关断时&#xff0c;带载时欠压; 断后由于电源内阻原因&#xff0c;负…

初识Docker(架构、安装Docker)

一、什么是Docker Docker 是一个开源的应用容器引擎&#xff0c;它允许开发者将应用程序及其依赖打包到一个轻量级、可移植的容器中。这些容器可以在不同的计算平台上运行&#xff0c;如Linux和Windows&#xff0c;并且可以实现虚拟化。Docker 的设计目标是提供一种快速且轻量…