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

2024-06-23 10:20

本文主要是介绍微服务——重复消费(幂等解决方案),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

    • 一、唯一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.chinasem.cn/article/1086880

相关文章

springboot家政服务管理平台 LW +PPT+源码+讲解

3系统的可行性研究及需求分析 3.1可行性研究 3.1.1技术可行性分析 经过大学四年的学习,已经掌握了JAVA、Mysql数据库等方面的编程技巧和方法,对于这些技术该有的软硬件配置也是齐全的,能够满足开发的需要。 本家政服务管理平台采用的是Mysql作为数据库,可以绝对地保证用户数据的安全;可以与Mysql数据库进行无缝连接。 所以,家政服务管理平台在技术上是可以实施的。 3.1

LeetCode--220 存在重复元素 III

题目 给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ。 示例 示例 1:输入: nums = [1,2,3,1], k = 3, t = 0输出: true示例 2:输入: nums = [1,0,1,1], k = 1, t = 2输出: true示例

LeetCode--217 存在重复元素

题目 给定一个整数数组,判断是否存在重复元素。如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。 示例 示例 1:输入: [1,2,3,1]输出: true示例 2:输入: [1,2,3,4]输出: false示例 3:输入: [1,1,1,3,3,4,3,2,4,2]输出: true class Solution {p

axios全局封装AbortController取消重复请求

为什么? 问题:为什么axios要配置AbortController?防抖节流不行吗? 分析: 防抖节流本质上是用延时器来操作请求的。防抖是判断延时器是否存在,如果存在,清除延时器,重新开启一个延时器,只执行最后一次请求。节流呢,是判断延时器是否存在,如果存在,直接return掉,直到执行完这个延时器。事实上,这些体验感都不算友好,因为对于用户来说,得等一些时间,尤其是首次请求,不是那么流畅

微服务中RPC的强类型检查与HTTP的弱类型对比

在微服务架构中,服务间的通信是一个至关重要的环节。其中,远程过程调用(RPC)和HTTP是两种最常见的通信方式。虽然它们都能实现服务间的数据交换,但在类型检查方面,RPC的强类型检查和HTTP的弱类型之间有着显著的差异。本文将深入探讨这两种通信方式在类型检查方面的优缺点,以及它们对微服务架构的影响。 一、RPC的强类型检查 RPC的强类型检查是其核心优势之一。在RPC通信中,客户端和服务端都使

中国341城市生态系统服务价值数据集(2000-2020年)

生态系统服务反映了人类直接或者间接从自然生态系统中获得的各种惠益,对支撑和维持人类生存和福祉起着重要基础作用。目前针对全国城市尺度的生态系统服务价值的长期评估还相对较少。我们在Xie等(2017)的静态生态系统服务当量因子表基础上,选取净初级生产力,降水量,生物迁移阻力,土壤侵蚀度和道路密度五个变量,对生态系统供给服务、调节服务、支持服务和文化服务共4大类和11小类的当量因子进行了时空调整,计算了

SpringCloud - 微服务

1、微服务介绍         参考: 微服务百度百科 1.1 概念         微服务(或称微服务架构)是一种云原生架构方法,在单个应用中包含众多松散耦合且可单独部署的小型组件或服务。 这些服务通常拥有自己的技术栈,包括数据库和数据管理模型;通过一个REST API、事件流和消息代理组合彼此通信;以及按照业务能力进行组织,具有通常称为有界上下文的服务分隔线。         微服务特

免费内网穿透工具 ,快解析内网穿透解决方案

在IPv4公网IP严重不足的环境下,内网穿透技术越来越多的被人们所使用,使用内网穿透技术的好处有很多。 1:无需公网ip 物以稀为贵,由于可用的公网IP地址越来越少,价格也是水涨船高,一个固定公网IP一年的成本要上万,而使用内网穿透技术则不需要公网IP的支持。 2:提高安全性 使用内网穿透技术,无需在路由器映射端口,我们知道黑客通常会使用端口扫描来寻找攻击对象,不映射端口能大大提高服务器的安全

分布式事务的解决方案(一)

前言应用场景 事务必须满足传统事务的特性,即原子性,一致性,分离性和持久性。但是分布式事务处理过程中, 某些场地比如在电商系统中,当有用户下单后,除了在订单表插入一条记录外,对应商品表的这个商品数量必须减1吧,怎么保证? 在搜索广告系统中,当用户点击某广告后,除了在点击事件表中增加一条记录外, 还得去商家账户表中找到这个商家并扣除广告费吧,怎么保证? 一 本地事务 以用户A

Android 10.0 系统开机重启桌面时钟小部件widget加载慢解决方案

1.前言 在10.0的系统rom产品定制化开发中,在Launcher3桌面系统默认会有时钟widget小部件显示在首屏的,但是发现在开机过程 中会显示的好慢,等进入桌面了 还没显示,所以接下来分析下相关的源码流程,来实现相应的功能 2.系统开机重启桌面时钟小部件widget加载慢解决方案的核心类 frameworks\base\services\appwidget\java\com\andr