第十三章 RabbitMQ之消息幂等性

news2024/11/28 16:26:42

目录

一、引言

二、消息幂等解决方案

2.1. 方案一

2.2. 方案二


一、引言

幂等是一个数学概念,用函数表达式来描述是这样的:f(x) = f(f(x)) 。在程序开发中,则是指同一个业务,执行一次或多次对业务状态的影响是一致的。有些业务天生就是幂等的,如查询和删除业务执行一次和多次的结果是一样的,而像用户下单、用户退款是非幂等业务。

实际项目开发中,我们在提交表单时,很多时候可能会重复提交表单,这个时候我们通过token令牌等唯一标识来解决,第一次提交页面将缓存中的唯一标识删除,后面再重新提交时缓存中的标识已经被删了因此重复提交失败。

我们在消息消费的过程中也会存在同样的问题,即如何来保障所有业务在接收RabbitMQ消息时保证业务的幂等性,避免消息重复消费呢?

二、消息幂等解决方案

2.1. 方案一

1. 给每个消息都设置/生成一个唯一id,利用id区分是否是重复消息,与消息一起投递给消费者。

2. 消费者接收到消息后处理自己的业务,业务处理成功后将消息ID保存到数据库

3. 如果下次又收到相同消息,去数据库查询判断是否存在,存在则为重复消息放弃处理

 核心代码:

我们可以在生产者和消费者两端分别声明消息转换器的Bean,本案例为了方便直接在启动类中声明消息转换器,并配置自动为消息创建id。

package com.example.consumer;

import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class ConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }

    @Bean
    public MessageConverter messageConverter(){
        // 1.定义消息转换器
        Jackson2JsonMessageConverter jjmc = new Jackson2JsonMessageConverter();
        // 配置自动创建消息id,用于识别不同消息,也可以在业务中基于ID判断是否是重复消息
        jjmc.setCreateMessageIds(true);
        return jjmc;
    }
}
package com.example.publisher;

import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class PublisherApplication {

    public static void main(String[] args) {
        SpringApplication.run(PublisherApplication.class, args);
    }

    @Bean
    public MessageConverter messageConverter(){
        // 1.定义消息转换器
        Jackson2JsonMessageConverter jjmc = new Jackson2JsonMessageConverter();
        // 配置自动创建消息id,用于识别不同消息,也可以在业务中基于ID判断是否是重复消息
        jjmc.setCreateMessageIds(true);
        return jjmc;
    }
}

通过源码可以看到默认生成的是UUID:

 通过RabbitMQ浏览器界面可以看到消息已经生成了一个唯一ID :

2.2. 方案二

结合业务逻辑,基于业务本身做判断。以余额支付业务为例,我们要在支付后修改订单状态为已支付,应该在修改订单状态前先查询订单状态,判断状态是否是未支付。只有未支付订单才需要修改,其他状态不做处理:

核心代码 

 上述代码可以通过乐观锁来实现,替换代码如下:

 

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

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

相关文章

3款逆天级Word插件,一键解决文档排版烦恼

在当今快节奏的工作环境中,高效的文档处理能力至关重要,今天电脑天空将为大家介绍三款卓越的Word插件,它们能显著提升你的写作效率,让您的工作成果更加出色。 1. 文档排版利器:小恐龙公文排版助手 小恐龙公文排版助手…

Chromium 如何查找已经定义的mojom函数实现c++

进程通信定义通常都是用.mojom文件或者idl文件格式 以content\common\frame.mojom里面的BeginNavigation函数为例。 一、如何查找BeginNavigation函数定义,在vscode里面直接搜索BeginNavigation,过滤条件 *.idl,*.mojom,*.cc 效果: 这样…

HECTOR:一种新型多模态深度学习模型用于预测子宫内膜癌复发风险|顶刊精析·24-10-12

小罗碎碎念 这篇文章是关于一项名为HECTOR(histopathology-based endometrial cancer tailored outcome risk)的研究,它是一个基于多模态深度学习的预测模型,用于预测子宫内膜癌(EC)的复发风险。 作者角色作…

threejs-加载gltf模型

一、介绍 1.概念 glTF(gl传输格式)是一种开放格式的规范 (open format specification), 用于更高效地传输、加载3D内容。该类文件以JSON(.gltf)格式或二进制(.glb)格式提…

常用的web服务器简述

一.Web服务器介绍 ‌Web服务器是一种运行于互联网上的计算机硬件或软件,用于存储、处理和传输网页和其他网站内容。‌ 它通常运行在服务器上,绑定服务器的IP地址并监听某一个TCP端口,接收来自客户端的请求,然后向客户端发送所请求…

中国地级市生态韧性数据及城市生态韧性数据(2000-2022年)

一测算方式: 参考C刊《管理学刊》楚尔鸣(2023)老师的做法,城市生态韧性主要衡量一个城市在面临生态环境系统压力或突发冲击时,约束污染排放、维护生态环境状态和治理能力提升的综合水平。 参考郭海红和刘新民的研究&a…

JavaScript操作DOM对象

DOM 是 JavaScript 操作网页的接口,全称为“文档对象模型” (Document Object Model)。它的作用是将网页转为一个 JavaScript 对象,从而可以用脚本进行各种操作(比如对元素增删 内容) 节点的类型有七…

基于STM32的智能家居--硬件接线

分配GPIO 1.首先分配串口通讯引脚,该开发板中有三组串口引脚分别分配如图所示。 2.分配SPI。 3.其他为普通GPIO口,B8,B9模拟IIC协议与OLED屏幕进行通讯。

GEE数据集:美国玉米、大豆和冬小麦 QDANN 30m 产量图/数据集

目录 QDANN 30m Yield Map for Corn, Soy, and Winter Wheat in the U.S美国玉米、大豆和冬小麦 QDANN 30m 产量图 简介 数据集预处理 代码 引用 许可 QDANN 30m Yield Map for Corn, Soy, and Winter Wheat in the U.S美国玉米、大豆和冬小麦 QDANN 30m 产量图 简介 …

指针——数组(指针)传参

(一)前文问题答案解析 1、代码 int(*pa[10])[5] 的解析 某人:嗯,有*pa,这不很明显是个指针嘛,然后 [5] 说明是个数组指针,int类型,[10]。。。。 这这这,很明显不是指针。…

【笔记】Day2.3.3自定义异常+2.3.4resource注入

此项目一共写了两个自定义异常 因为: 1.前后端交互的响应码(如200,401)大差不差 区别几乎只在于响应结果中的msg和code表达是否成功 2.而微服务的接口之间调用采用restful方式 状态码要使用标准的http状态码 如:200…

【Linux探索学习】第四弹——Linux权限管理详解:理解用户、组和权限之间的关系

前言: 在前面我们已经学习了Linux的基础指令,相信大家对Linux已经有了一定的认识,今天我们来学习Linux权限的相关知识点,Linux权限是Linux初学者必须要掌握的内容 目录 一、Linux下用户类型 二、权限基本概念 三、权限的表示 四…

SpringBoot整合web中使用jsp

1、在pom.xml文件中导入jsp依赖的jar包&#xff0c;一个是jstl标签&#xff0c;一个是jsp的引擎 <dependency><groupId>org.apache.taglibs</groupId><artifactId>taglibs-standard-spec</artifactId><version>1.2.5</version> <…

窗口售票系统1.0版本

本窗口售票系统实现了三个售票窗口的随机售票&#xff0c;实现随机到某一个窗口买票&#xff0c;总票余量都会减少&#xff0c;即三个窗口共享同一个票余量。若票余量小于一次性购票量&#xff0c;则提示报错&#xff1b;若车票售罄&#xff0c;则代码结束运行。 代码实现&…

代码随想录算法训练营第三十天|491. 非递减子序列,46. 全排列,47. 全排列 II,332. 重新安排行程,51. N 皇后,37. 解数独

491. 非递减子序列&#xff0c;46. 全排列&#xff0c;47. 全排列 II&#xff0c;332. 重新安排行程&#xff0c;51. N 皇后&#xff0c;37. 解数独 491. 非递减子序列46. 全排列47. 全排列 II332. 重新安排行程51. N 皇后37. 解数独 491. 非递减子序列 给你一个整数数组 nums…

技术成神之路:设计模式(二十)装饰模式

介绍 装饰模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许在不改变对象自身的情况下&#xff0c;动态地为对象添加额外的职责。这个模式通常用于增强或改变对象的功能。 1.定义 装饰模式通过创建一个装饰类&#xff0c;将功能动态地添加…

网站设计公司怎么评估?2024网站定制公司哪家好

在选择一家网站建设公司时&#xff0c;需要采取一些筛选方法来评估其能力和专业性。可以通过查看公司的案例展示、项目经验、团队规模等方面来评估公司的实力。同时&#xff0c;需要了解公司是否有与自己业务相似的项目经验&#xff0c;以便更好地满足自己的需求。在选择公司时…

win0删除 Windows.old

参考&#xff1a;https://blog.csdn.net/xitongzhijia_abc/article/details/126270452 win10如下所示&#xff1a; 打开 设置–>系统—>存储

Ps:PDF 演示文稿

Ps菜单&#xff1a;文件/自动/PDF 演示文稿 Automate/PDF Presentation PDF 演示文稿 PDF Presentation命令提供了创建 PDF 演示文稿的多种选项&#xff0c;用户可以添加当前打开的文件或手动选择文件&#xff0c;选择背景颜色、字体大小等&#xff0c;设置演示文稿的页面切换间…