微服务——重复消费(幂等解决方案)

news2024/11/26 10:17:12

目录

    • 一、唯一ID机制
    • 二、幂等性设计
    • 三、状态检查机制
    • 四、利用缓存和消息队列
    • 五、分布式锁
    • 总结

在微服务中,防止重复消费的核心思想是通过设计使得操作一次与多次产生相同的效果,并为每次操作生成唯一的ID。这样,即使在消息被重复发送的情况下,系统也能通过检查ID来避免重复处理。

在这里插入图片描述

一、唯一ID机制

在微服务架构中,为每次操作生成唯一ID是防止重复消费的关键步骤。通过为每个操作分配一个唯一的标识符,系统可以在后续的处理中识别并排除重复的消息。这种唯一ID机制有助于确保不同操作之间的隔离性,从而避免潜在的冲突和数据不一致问题。

二、幂等性设计

幂等性是指一个操作无论执行多少次,其结果都相同。在微服务中,幂等性设计是防止重复消费的重要手段。通过实现幂等操作,即使消息被重复消费,也不会对系统产生负面影响。实现幂等性的方法包括记录操作状态、状态检查机制以及使用数据库唯一键约束等。

三、状态检查机制

在微服务中,状态检查机制是防止重复消费的关键环节。通过检查消息的状态,系统可以判断该消息是否已经被处理过。如果消息的状态表示已经被处理,则系统可以直接忽略该消息,避免重复处理。为了实现状态检查机制,可以使用数据库中的唯一键约束来记录已处理消息的关键信息。

四、利用缓存和消息队列

为了提高处理效率和减少资源浪费,可以利用Redis等缓存工具来存储已处理的消息ID。当系统接收到新的消息时,首先检查缓存中是否存在相同的ID。如果存在,则说明该消息已经被处理过,直接丢弃即可。此外,还可以利用消息队列的幂等性特性和去重机制来避免重复消费。通过设置合理的重试次数和策略,可以避免无限重试导致的资源浪费。

五、分布式锁

在微服务架构中,分布式锁是实现消息顺序消费和防止重复消费的有效手段。通过分布式锁机制,可以确保同一时间只有一个消费者处理消息。基于Redis的分布式锁和基于ZooKeeper的分布式锁是实现分布式锁的常见方式。这些锁机制可以在多个微服务实例之间实现协同工作,从而确保消息的正确处理和避免重复消费。

总结

最佳方案:setNX + 数据库唯一索引

设置一个10s(根据重复消费并发量周期考虑)的分布式锁(缓存查询效率高),用于处理短期的重复消息。
同时用数据库唯一索引进行一个兜底。

// messageId 可以是一个订单编号
public String processMessage(String messageId) {  
        // 定义一个Redisson的分布式锁对象  
        String lockName = "message:lock:" + messageId;  
        RLock lock = redissonClient.getLock(lockName);  
  
        // 最常见的使用方法 tryLock(long waitTime, long leaseTime, TimeUnit unit)  
        // 尝试加锁,上锁以后10秒自动解锁  
        // 等待时间内加锁成功,则立即返回true,否则立即返回false  
        boolean locked = false;  
        try {  
            locked = lock.tryLock(10, TimeUnit.SECONDS);
            if (locked) {  
                // 成功获取锁,处理消息  
                try {  
                // 查询数据库唯一id是否已经生成,true则返回,false则执行逻辑
	                if (getId(messageId)) {
	                	return "成功";
	                }
	                执行业务逻辑,并生成数据库唯一id.......
                } catch (Exception e) {  
                    // 处理异常,比如数据库的唯一性约束异常等  
                }  
            } else {  
            // 加锁失败说明已经有线程在处理
                return "成功";
            }  
        }
    }  

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

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

相关文章

动态创建接口地址

和SpringBoot版本有关系 这里用的boot 2.2.2

使用USI作为主SPI接口

代码; lcd_drive.c //***************************************************************************** // // File........: LCD_driver.c // // Author(s)...: ATMEL Norway // // Target(s)...: ATmega169 // // Compiler....: AVR-GCC 3.3.1; avr-libc 1.0 // // D…

Java并发编程:理解线程、同步和锁

第1章:引言 Java并发编程是多线程技术的一种实现方式,它在现代软件开发中扮演着至关重要的角色。随着计算机处理器核心数量的增加,以及云计算和大数据技术的普及,能够有效利用并发编程的程序员将能为企业创造更高的效率和价值。此…

小米15系列将首发骁龙8 Gen4 SoC

高通已确认2024年骁龙峰会定于10月21日举行。在这次峰会中高通将推出其最新的移动芯片Snapdragon 8 Gen4 SoC。著名科技博主DigitalChatStation今天证实,骁龙8 Gen4将以小米15系列首次亮相。这意味着小米15系列将是第一款使用这款新旗舰处理器的手机。 这不是小米第…

【软件设计】详细设计说明书(word原件,项目直接套用)

软件详细设计说明书 1.系统总体设计 2.性能设计 3.系统功能模块详细设计 4.数据库设计 5.接口设计 6.系统出错处理设计 7.系统处理规定 软件全套资料:本文末个人名片直接获取或者进主页。

使用ViewDragHelper打造属于自己的DragLayout(抽屉开关 )

</com.xujun.drawerLayout.drag.DragLayout> 在代码中若想为其设置监听器, 分别可以监听打开的 时候&#xff0c;关闭的时候&#xff0c;拖动的时候&#xff0c;可以在里面做相应的处理&#xff0c;同时我还加入了 自定义属性可以通过 app:range”480”或者setRange&am…

基于JSP技术的家用电器销售网站

开头语&#xff1a;你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSPJava 工具&#xff1a;ECLIPSE、MySQL数据库管理工具、Tomcat 系统展…

MVVM架构详解:前端开发的理想选择

目录 前言1. MVVM架构概述1.1 MVVM架构的定义1.2 MVVM与MVC的区别 2. MVVM架构的核心组件2.1 模型&#xff08;Model&#xff09;2.2 视图&#xff08;View&#xff09;2.3 视图模型&#xff08;ViewModel&#xff09; 3. MVVM架构的优势3.1 分离关注点3.2 提高代码可测试性3.3…

听说你还不会用Dagger2?Dagger2 For Android最佳实践教程

Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d(TAG,chef.cook()); } } 可以看到&#xff0c;在使用Dagger2的时候&#xff0c;使用者的代码会变得非常简洁。但是&#…

Windows10中端口被占用处理方法

前言 在Windows 10中&#xff0c;查看端口被占用情况的方法主要依赖于命令行工具netstat。以下是详细步骤&#xff0c;以及必要的解释和归纳&#xff1a; 打开命令提示符 方法1&#xff1a;使用快捷键Win R&#xff0c;打开“运行”对话框&#xff0c;输入cmd&#xff0c;然…

2024-06-23 编译原理实验3——语义分析

文章目录 一、实验要求二、实验设计三、实验结果四、附完整代码 补录与分享本科实验&#xff0c;以示纪念。 一、实验要求 基于前面的实验&#xff0c;编写一个程序对使用 C—语言书写的源代码进行语义分析&#xff0c;输出语义分析中发现的错误&#xff08;涉及 17 种错误类…

异地局域网纯软件组网如何设置?

在现代社会中&#xff0c;随着企业的不断扩张和分布&#xff0c;异地办公成为一种常见的工作模式。随之而来的是&#xff0c;如何实现异地局域网的组网设置成为了一个挑战。在这种情况下&#xff0c;采用纯软件组网方案是一种有效的解决方案。本文将介绍异地局域网纯软件组网设…

Redis数据库的删除和安装

Redis数据库的删除和安装 1、删除Redis数据库2、下载Redis数据库 1、删除Redis数据库 没有下载过的&#xff0c;可以直接跳到下面的安装过程↓ 我们电脑中如果有下载过Redis数据库&#xff0c;要更换版本的话&#xff0c;其实Redis数据库的删除是比较简单的&#xff0c;打开我…

字节大神强推千页PDF学习笔记,弱化学历问题,已拿意向书字节提前批移动端!

主要问java&#xff0c;以及虚拟机&#xff0c;问了一点android 1.实习项目有关的介绍以及问题回答 2.反射与代理的区别&#xff0c;动态代理&#xff0c;静态代理&#xff0c;二者的区别&#xff0c;以及代理模式的UML图 3.字节码技术 4.虚拟机的双亲委派&#xff0c;以及好…

1Panel应用推荐:Bitwarden开源密码管理器

1Panel&#xff08;github.com/1Panel-dev/1Panel&#xff09;是一款现代化、开源的Linux服务器运维管理面板&#xff0c;它致力于通过开源的方式&#xff0c;帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用&#xff0c;1Panel特别开通应用商店&am…

贪心算法—

贪心算法是一种在每一步选择中都采取在当前状态下最好或最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致结果是全局最好或最优的算法。这种算法并不总是能找到全局最优解&#xff0c;但在某些问题上能提供足够好的解决方案。贪心算法的关键特性包括&#…

判断题无答案22届期末复习

判断: 1-3.结构体变量不能进行整体输入输出。 1-4.不同类型的结构变量之间也可以直接赋值。 1-5假设结构指针p已定义并正确赋值,其指向的结构变量有一个成员是int型的num,则语句 (*p).num = 100; 等价于p->num=1…

1panel OpenResty 设置网站重定向

当我们部署网站时需要&#xff0c;输入"cheshi.com"域名回车&#xff0c;希望他自动跳转https://cheshi.com/indx/&#xff0c;而不是直接跳转https://cheshi.com时可以利用重定向来实现&#xff0c; 这里演示的是 1panel 如何设置&#xff08;nginx 貌似也是这样配…

【大疆pocket3】到手后5个必改初始设置关键点(下)

【大疆pocket3】到手后5个必改初始设置关键点&#xff08;下&#xff09; 一&#xff0c;简介二&#xff0c;必改关键点2.1 数字变焦2.2 慢动作拍摄2.3 神奇的小摇杆2.4 云台模式使用方法&#xff08;默认增稳模式和俯仰角锁定的差异化以及使用场景&#xff09;2.5 云台转向速度…

[HBM] HBM 国产进程, 国产HBM首次研发成功 (202406)

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解DDR》 AI 的火热浪潮带火了高带宽内存的需求&#xff0c;HBM已是存储市场耀眼的明星。目前市场上还没有国产HBM, 什么时候可以看到国产希望呢&#xff1f; 或许现在可以看到曙光了。 1. 设计端 1…