RabbitMQ如何保证消息不被重复消费(幂等性问题详解)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 案例讲解RabbitMQ如何保证消息不被重复消费!
【辰兮要努力】:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行!

博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端、后台、数据库、项目案例等相关知识点总结,感谢你的阅读和关注,希望我的博客能帮助到更多的人,分享获取新知,大家一起进步!

吾等采石之人,应怀大教堂之心,愿我们奔赴在各自的热爱里…

一、幂等性概念简介

幂等:是一个数学概念,表示N次变换和1次变换的结果相同。

在这里插入图片描述

在计算机中编程中,一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。


二、接口幂等性问题原因

  • 网络波动, 可能会引起重复请求
  • 页面重复刷新
  • 浏览器重复的HTTP请求
  • 定时任务重复执行
  • 用户双击提交按钮
  • 数据的重复推送等等

如上等等,很多业务场景都会导致幂等性问题!

举个例子:比如你购物只想购买一件商品,但是网络卡顿,你按了多次提交按钮后,系统将此订单生成了两次!如上即数据库生成了两条订单记录!即产生了幂等性的问题!

正确的情况: 一个商品页点提交,只会产生一条订单信息!


三、业务场景实例+解决方案

业务场景:数据中心通过消息队列往我们嫌疑人资源表中推送数据(RabbitMQ消费者开始消费)

推送流程:手动和自动(按时间推);

手动推送:手动过程可以自选如推送2022年1月数据数据或者推送 2022年1月和二月数据

在这里插入图片描述


嫌疑人资源表结构举例

在这里插入图片描述

导致问题:如果不做幂等性处理,数据库该表中会出现重复的嫌疑人案件信息


解决方案

A. 设计全局唯一消息id

1.推送过来的数据我们在业务逻辑层处理 主键id设计为 案件id+嫌疑人id,插入到数据库
2.后续推送的数据,我们先根据主键id 查询数据库中是否存在,如果存在则过滤掉此数据,如果不存在则插入数据库

B.数据库唯一主键

1.数据库DB层面,主键也是不能冲突的,重复的数据是无法插入的

如上即解决了本业务场景中嫌疑人相关案件信息重复推送的问题


业务场景提问

为什么不直接使用嫌疑人id当中主键呢?

请添加图片描述

:因为一个人可能会犯多次案件,当嫌疑人id+案件id拼接在一起的时候即可保障此数据的唯一性!


四、思路分享

解决数据消息不重复消费问题从 Service层和DB两个层面考虑问题,设计一个全局id,同时数据库设计唯一主键

请添加图片描述

其余不同业务场景

1、部分场景下数据重复推送可能部分细节会发生变化,先根据主键查一下,如果这数据都有了,就进行update 操作

2、如果你不能将唯一主键存储在id位置,可以设置唯一索引

如上案例:将案件id+嫌疑人id设计为唯一索引


引入Redis解决重复消费问题

请添加图片描述

1、利用Redis,首先系统生成全局唯一的 id,用set操作放入Redis中
2、如订单信息id,消费后存储在Redis中,如果下次再来,先查看Redis中是否存在
3、如果存在,即此消息已经被消费过(后续不做消费处理)
4、如果不存在,即未消费,此时再将此id存入Redis中,进行后续的逻辑操作

在这里插入图片描述

Java进阶参考Java面试总结整理

期待整理更多有趣的文章,我下期再见……


非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤️ 分享👥 留言💬thanks!!!

📚愿我们奔赴在各自的热爱里!

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
消息中间件 存储 canal
3分钟白话RocketMQ系列—— 如何保证消息不丢失
3分钟白话RocketMQ系列—— 如何保证消息不丢失
3808 1
|
消息中间件 存储 Kafka
如何保证MQ消息队列的高可用?
如何保证MQ消息队列的高可用?
270 0
|
6月前
|
消息中间件 存储 NoSQL
RabbitMQ的幂等性、优先级队列和惰性队列
【1月更文挑战第12天】用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。举个最简单的例子,那就是支付,用户购买商品后支付,支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额发现多扣钱了,流水记录也变成了两条。在以前的单应用系统中,我们只需要把数据操作放入事务中即可,发生错误立即回滚,但是再响应客户端的时候也有可能出现网络中断或者异常等等
281 7
|
6月前
|
消息中间件 存储 运维
|
6月前
|
消息中间件 存储 NoSQL
RabbitMQ的幂等性、优先级队列和惰性队列
**摘要:** 本文讨论了RabbitMQ中的幂等性、优先级队列和惰性队列。幂等性确保了重复请求不会导致副作用,关键在于消费端的幂等性保障,如使用唯一ID和Redis的原子性操作。优先级队列适用于处理不同重要性消息,如大客户订单优先处理,通过设置`x-max-priority`属性实现。惰性队列自3.6.0版起提供,用于延迟将消息加载到内存,适合大量消息存储和消费者延迟消费的场景。
88 4
|
消息中间件
消息中间件系列教程(15) -RabbitMQ-基于全局消息ID解决幂等性问题
消息中间件系列教程(15) -RabbitMQ-基于全局消息ID解决幂等性问题
105 0
|
消息中间件 存储 Kafka
如何保证MQ中消息的可靠性传输?
如何保证MQ中消息的可靠性传输?
108 1
|
消息中间件 存储 Java
RabbitMQ如何保证消息的可靠性
RabbitMQ如何保证消息的可靠性
95 0
|
6月前
|
消息中间件 存储 缓存
【面试问题】MQ 如何保证消息的顺序性?
【1月更文挑战第27天】【面试问题】MQ 如何保证消息的顺序性?
|
6月前
|
消息中间件 缓存 监控
mq如何保证消息顺序性
mq如何保证消息顺序性
125 0