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

目录

    • 一、唯一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.mzph.cn/pingmian/32430.shtml

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

相关文章

K8S - 实现statefulset 有状态service的灰度发布

什么是灰度发布 Canary Release 参考 理解 什么是 滚动更新,蓝绿部署,灰度发布 以及它们的区别 配置partition in updateStrategy/rollingUpdate 这次我为修改了 statefulset 的1个yaml file statefulsets/stateful-nginx-without-pvc.yaml: --- apiVe…

Android - 跳转到应用商店进行应用打分功能实现

2.将过滤出的这些应用商店展示给用户,如果没有安装任何相关应用商店则提示用户“暂无安装相关应用商店”。 3.用户点击了某应用商店之后,则跳转到该应用商店的APP详情页。 4.下面列出了比较核心的代码,可进行参考。 /** 过滤出已经安装的包…

工业用焦炉集气管压力控制状态远程预警方法

工业用焦炉集气管压力控制状态远程预警方法 一、项目提出前状况: 焦化厂焦炉集气管压力是炼焦生产过程中重要的工艺参数(其控制目标80~120Pa),焦炉集气管压力的稳定是焦炉正常生产的重要保证。集气管压力过高会造成焦炉炉体冒烟冒火,污染环境,对操作人员的人身安全构成…

不同交换机之间相同VLAN间主机通信

1、搭建网络拓扑 搭建拓扑,分配IP地址,划分vlan,分配端口 2、配置交换机 //进入全局配置模式 Switch>enable Switch#config terminal Enter configuration commands, one per line. End with CNTL/Z. Switch(config)#hostname SW1 …

ubuntu 20.04 访问csdn报错 Secure connection failed

打扰了,csdn服务器的问题,和源没关系,后面又重新测试了一下。刚好那一刻网站连上了。 暂时没有好办法,等待一段时间就连上了,改host似乎也不太行。 问题原因: 我一边更新源 sudo apt update & apt up…

35.netty模拟redis客户端向redis服务端写数据

redis命令:set name zhangsan *3 $3 set $4 name $8 zhangsan *3 表示有三个元素 $3表示 set 命令的长度,3个字节 $4 表示name的长度,4个字节 $8 表示zhangsan的长度,8个字节 package com.xkj.nian;import io.netty.bootstrap.Bootstrap; import io.netty.buffer.ByteB…

【专业英语 复习】第4章 System Software

1. Most operating systems support the ability to switch between different applications. This is called ____. A driving B multitasking C translating D booting 正确答案:B (多任务处理) 大多数操作系统支持在不同应用程…

OPENCV中0x00007FFE5F35F39C发生异常

原因:读取图片时已经为灰度图像,又进行了一次灰度处理cvtColor 解决方法:如上图所示,将cv::imread的第二个参数改为cv::IMREAD_COLOR;或者保留cv::IMREAD_GRAYSCALE,删去后面的cv::cvtColor

git-pull详解

NAME git-pull - Fetch from and integrate with another repository or a local branch SYNOPSIS git pull [<options>] [<repository> [<refspec>…​]] DESCRIPTION Incorporates changes from a remote repository into the current branch. If the…

js如何把数组网页元素按分隔符返回字符串?document.getElementsByClassName(“class1“)

要将数组中的网页元素按分隔符返回字符串&#xff0c;你可以使用 JavaScript 中的 Array.prototype.map() 方法和 Array.prototype.join() 方法。 首先&#xff0c;使用 document.getElementsByClassName("class1") 获取到指定类名的所有网页元素&#xff0c;并将其…

ChatTTS,智能聊天机器人,深度学习技术!\n\n标题建议ChatTTS智能聊天机器人的开源之旅。

**项目介绍**&#xff1a;  ChatTTS是一个基于自然语言处理和深度学习技术的智能聊天机器人项目。它利用了开源的Gensim和NLTK库进行文本分析&#xff0c;并结合了TensorFlow或PyTorch等深度学习框架&#xff0c;构建了一个强大的自然语言处理模型。ChatTTS能够理解并生成人类…

UE开发随笔------json与struct互相转换(FJsonObjectConverter)

UStruct定义&#xff1a; USTRUCT() struct FHeartBeatMsg {GENERATED_BODY() public:UPROPERTY()FString pcCode TEXT("");UPROPERTY()FString deviceType TEXT("");UPROPERTY()FString messageType TEXT("");UPROPERTY()FString content …

LLm与微调入门

两种 Finetune 范式 增量预训练微调 使用场景&#xff1a;让基座模型学习到一些新知识&#xff0c;如某个垂类领域的常识 训练数据&#xff1a;文章、书籍、代码等 指令跟随微调 使用场景&#xff1a;让模型学会对话模板&#xff0c;根据人类指令进行对话 训练数据&#…

C++记录程序运行时间的4方法

目录 1. 使用 <chrono>库&#xff08;C11及以后版本&#xff09; 2. 使用<ctime>库&#xff08;较旧但常用的方法&#xff09; 3、使用第三方库&#xff08;如Boost.Timer&#xff09; 4. 使用Windows API函数&#xff08;Windows平台特有&#xff09; 1. 使用 …

Sequelize入门及简单的增删改查

前言 学习一下NodeJS怎么使用Sequelize怎么查询数据库数据 一、Sequelize是什么&#xff1f; Sequelize 是一个基于 promise 的 Node.js ORM, 二、搭建项目 1.安装过程 npm i -g sequelize-cli //全局安装sequelize-clinpm i sequelize mysql2 //安装sequelize和mysql2…

System.Runtime, Version=6.0.0.0,生成的dll使用出现错误问题

解决&#xff1a; 1.unity左上角file点击选中build settings 点击player settings &#xff0c;然后在player的window的other settings的configuration更改为 Framerwork 其实这个不换也可以的&#xff0c;我后面调试完&#xff0c;发现这个不是重点&#xff0c;下面第2点才是…

Python15 理解Python迭代器

1.Python中的迭代器 在Python中&#xff0c;迭代器是一种允许程序员遍历一个容器&#xff08;特别是列表、元组、字典等集合类型&#xff09;的对象&#xff0c;而不需要了解容器的内部结构。迭代器提供了一个统一的方法来逐一访问容器中的元素&#xff0c;这种机制称为迭代。…

使用自签名 TLS 将 Dremio 连接到 MinIO

Dremio 是一个开源的分布式分析引擎&#xff0c;为数据探索、转换和协作提供简单的自助服务界面。Dremio 的架构建立在 Apache Arrow&#xff08;一种高性能列式内存格式&#xff09;之上&#xff0c;并利用 Parquet 文件格式实现高效存储。有关 Dremio 的更多信息&#xff0c;…

应用占内存,应用太耗电。不如冻起来!

在安卓系统中&#xff0c;一些不常用的系统组件、进程或顽固应用可能会持续在后台运行&#xff0c;占用宝贵的内存资源&#xff0c;导致手机出现卡顿、续航减少等问题。今天我将向您推荐几款实用的应用冻结工具&#xff0c;它们能够帮助您冻结或隐藏这些不必要的应用&#xff0…

最新PHP仿猪八戒任务威客网整站源码/在线接任务网站源码

资源介绍 老规矩&#xff0c;截图为亲测&#xff0c;前后台显示正常&#xff0c;细节功能未测&#xff0c;有兴趣的自己下载。 PHP仿猪八戒整站源码下载&#xff0c;phpmysql环境。威客开源建站系统&#xff0c;其主要交易对象是以用户为主的技能、经验、时间和智慧型商品。经…