当前位置: 首页 > news >正文

rocket mq保证消息幂等性

在互联网应用中,尤其在网络不稳定的情况下,消息队列 RocketMO 的消息有可能会出现重复,这个重复简单可以概括为以下情况:

1、发送时消息重复

当一条消息已被成功发送到服务端并完成持久化,此时出现了网络闪断或者客户端宕机,导致服务端对客户端应答失败。如果此时生产者意识到消息发送失败并尝试再次发送消息,消费者后续会收到两条内容相同并日 Message lD 也相同的消惠

2、投递时消息重复
消息消费的场景下,消息已投递到消费者并完成业务处理,当客户端给服务端反馈应答的时候网络闪断。 为了保证消息至少被消费一次,消息队列 RocketMO 的服务端将在网络恢复后再次尝试投递之前已被处理过的消息,消费者后续会收到两条内容相同并且 Message lD 也相同的消息。

3、负载均衡时消息重复(包括但不限于网络抖动、Broker 重启以及订阅方应用重启)当消息队列 RocketMQ 的 Broker 或客户端重启、扩容或缩容时,会触发 Rebalance,此时消费者可能会收到重复消息。

消费者重复消息解决方案

针对消费者重复消息的解决方案,可以采用如下的几种方案。

1.采用数据库乐观锁实现. 2.采用Redis的写入,因为Redis的写入操作支持天然的幂等性。

消费数据只是单纯的写入数据库
可以在生产消息的时候为每一个消息加一个全局唯一ID,消费数据插入数据库之前根据主键ID判断数据是否存在,或者建立联合主键索引,重复插入时会报错
消费数据只是写入redis中
不需要处理,因为redis天然具有幂等性
复杂业务情况
将所有消费过的消息ID存入redis,使用redis进行消费判断,和数据库判断相比更快

1、mysql表结构

DROP TABLE IF EXISTS `message_idempotent`;
CREATE TABLE `message_idempotent` (
  `message_id` varchar(50) NOT NULL COMMENT '消息ID',
  `message_content` varchar(2000) DEFAULT NULL COMMENT '消息内容',
  `status` int DEFAULT '0' COMMENT '消费状态(0-未消费成功;1-消费成功)',
  `retry_times` int DEFAULT '0' COMMENT '重试次数',
  PRIMARY KEY (`message_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2、redis

redis_client.set('唯一业务id', "1",过期时间一周)

http://www.lryc.cn/news/397735.html

相关文章:

  • Elasticsearch基本操作
  • 设计模式探索:责任链模式
  • OceanBase 配置项系统变量实现及应用详解(3):新增配置项的方法
  • PCI PTS 硬件安全模块(HSM)模块化安全要求 v5.0
  • javaweb中的请求与响应--基于postman工具的应用(附带postman的详细安装步骤)
  • StarRocks下载使用说明和基础操作
  • 桥接模式案例
  • Spring源码二十二:Bean实例化流程五
  • Unity3D中UI层级改变详解
  • centos安装数据库同步工具sqoop并导入数据,导出数据,添加定时任务
  • asp .net core 避免请求body数据量过大
  • 搭建discuz论坛(lvs+nginx+http+mysql+nfs)8台服务器
  • 就业平台小程序的设计
  • hid-ft260驱动学习笔记 5 - ft260_i2c_probe
  • Android上如何使用perfetto分析systrace
  • React Hooks学习笔记
  • BGP第二日
  • rabbitmq集群创建admin用户之后,提示can access virtual hosts是No access状态
  • ARM功耗管理之多核处理器启动
  • java使用easypoi模版导出word详细步骤
  • Android 内部保持数据的方式
  • uniapp 表格,动态表头表格封装渲染
  • beyond Compare连接 openWrt 和 VsCode
  • 量化机器人能否识别市场机会?
  • 香橙派AIpro开发板评测:部署yolov5模型实现图像和视频中物体的识别
  • MongoDB教程(二):mongoDB引用shell
  • A133 Android10 root修改
  • 实验场:在几分钟内使用 Bedrock Anthropic Models 和 Elasticsearch 进行 RAG 实验
  • 代理详解之静态代理、动态代理、SpringAOP实现
  • Laravel - laravel-websockets 开发详解