MQ领消息丢失方案

⼀、哪些场景会丢失消

业务场景:下单⽀付成功后、给⽤户发送消费
在这里插入图片描述
⽤户反馈:⽀付成功以后,没有收到优惠券。原因:⽀付成功的消息丢失了

⼆、可能丢失消息的环节:

1、订单系统(⽣产者)向MQ推送消息的过程中丢失

可能原因:1、发送MQ的过程中⽹络波动;2、MQ确实收到消息了,但MQ的⽹络通信出现问题导致消息⽆法完成处理;3、在发送消息给MQ的过程中,MQ主节点故障,恰好在主从切换;4、其他等等原因

2、消息已经发送到MQ,MQ⾃身导致消息的丢失
可能原因:rocketMQ真正写⼊成功是指消息写⼊到了PageCache中,如果在这个过程中服务宕机就会导致消息写⼊失败

3、MQ已经写⼊到磁盘,但磁盘损坏导致消息的丢失

4、消息已经发送到优惠券系统(消费者)
可能原因:消费者已经接受消息,并完成了ACK,但这时候消费者在发优惠券前宕机了,也会导致丢失

三、⽣产者消息零丢失⽅案

问题:订单已经变更⽀付状态,但是消息却没有发送到MQ
解决⽅案:

1、发送消息,但消息状态是Half,判断⽹络是否正常;如果成功发送,更新订单为已⽀付,如果失败,就退款。
在这里插入图片描述

2、检查本地事务是否成功,如果订单状态更新成功,就向MQ发送commit,本地事务提交;如果失败就
rollback,本地事务也跟着回滚。
MQ接受到commit后会把之间的half消息进⾏提交,提交后,消息就对优惠券系统(消费者)可⻅,此时优惠券系
统就可以消费消息。
在这里插入图片描述
如果在订单更新状态后发送commit失败,这时候会有⼀个定时器,处理⻓时间未提交或回滚的half消息,会回查订单系统的事务状态。
回查事务状态:如果事务时已提交,那么订单系统就发送commit,如果是已回滚,那么久发送rollback。
在这里插入图片描述
补偿机制:
在这里插入图片描述
这个机制确保了订单发送消息给MQ的过程的⼀个⼀致性。
总结:事务消息机制或重试机制

四、事务消息机制的底层原理

问题:half消息是如何对消费者不可⻅的?
在这里插入图片描述
如果这时候消息回滚,half消息并不会物理删除,⽽是逻辑删除
在这里插入图片描述
如果没有收到commit/rollback,则会触发MQ的补偿机制
1、定时任务扫描RMQ_SYS_TRANS_HALF_TOPIC中⻓时间没有提交/回滚的消息,回查⽣产者业务的本地事务状
态。
2、最多重试15次,超过15次,⾃动rollback。
事务消息流程机制在这里插入图片描述
除了事务消息,是否还有其他⽅法可以保证消息零丢失?
1、同步发送+重试:把消息发送也放在本地事务中,这时候修改订单操作+发送消息要么都执⾏、要么都不执⾏。
缺点:这个发送消息可能会因为⽹络堵塞⽽不断重试导致耗时过⻓,⽀付超时

五、Broker消息零丢失⽅案

问题:消息还在PageCache,还没刷盘到磁盘,如果此时服务宕机,数据就会丢失。
在这里插入图片描述
解决⽅案:
MQ有2种刷盘机制:异步刷盘和同步刷盘。
异步刷盘:只把数据刷到PageCache,吞吐量和性能⾼,但容易丢失数据
同步刷盘:把数据刷到磁盘中才算完成,性能低,但安全
因此,在这⾥我们可以采⽤同步刷盘的策略来避免消息的丢失。
问题:这时候磁盘坏了呢?
这时候即使同步刷盘,数据还是会丢失。
解决⽅案:主从同步避免单机的磁盘损坏⻛险。
总结:要保证不丢失,要同步刷盘+主从同步

六、消费者消息零丢失⽅案

问题:消费者在拿到消息以后,还没来的及处理,就提交offset给broker,但这时,消费者服务器挂了。
在这里插入图片描述

解决⽅案:把⾃动提交改为⼿动提交的⽅式。
问题:现在已经⼿动提交了,但是却开启了⼦线程异步消费消息,这时候⼦线程消费完消息⼿动提交,但是主线程
的业务还没⾛完,然后⼜宕机了,这时候重启后因为offset已经被⼦线程提交了,所以消费者就不会再去拉去消息
了。在这里插入图片描述

总结:要保证不丢失,需要改成⼿动提交+同步消费。
最后,总结:
⽣产者消息零丢失⽅案:事务消息或重试机制
broker消息零丢失⽅案:同步刷盘+主从架构
消费者消息零丢失⽅案:⼿动提交+同步消费

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pytorch 实现线性回归 softmax(Pytorch 04)

一 softmax 定义 softmax 是多分类问题,对决策结果不是多少,而是分类,哪一个。 为了估计所有可能类别的条件概率,我们需要一个有 多个输出的模型,每个类别对应一个输出。为了解决线 性模型的分类问题,我们…

Linux cp、mv命令显示进度条

1.advcpmv 平常使用cp 拷贝大文件时,看不到多久可以完成,虽然加上-v参数也只能看到正在拷贝文件,那就使用以下方法实现 git clone https://github.com/jarun/advcpmv.git cd advcpmv/ bash install.shmv ./advcp /usr/local/bin/ mv ./advmv …

【旅游景点项目日记 | 第二篇】基于Selenium爬取携程网景点详细数据

文章目录 3.基于Selenium爬取携程网景点详细数据3.1前提环境3.2思路3.3代码详讲3.3.1查询指定城市的所有景点3.3.2获取详细景点的访问路径3.3.3获取景点的详细信息 3.4数据库设计3.5全部代码3.6效果图 3.基于Selenium爬取携程网景点详细数据 3.1前提环境 确保安装python3.x环…

生产力工具|安装更新R软件(R、studio)

内容介绍: 安装R软件: 下载 R X64 3.5.1: 访问官方R网站 https://cran.r-project.org/。选择适合Windows版本的安装包。将安装包下载到您的计算机。 本地安装: 运行下载的“R-3.5.1-win.exe”文件。按照安装向导,选择安装路径,取消…

Windows 进程权限浅谈 -- 提权 / 降权

在 Windows 上,用户对权限并不敏感,可能最为直观的是 UAC ,但相信很多人已经关掉了它的提示。 但其实安全性早已深入了 Windows 的方方面面。Windows Vista 引入了一个称为强制完整性控制(Mandatory Integrity Controls&#xff0…

BMS设计中的短路保护和MOSFET选型(上)

电池管理系统(BMS)是一种能够对电池进行监控和管理的电子装备,是电池与用户之间的纽带。通过对电压、电流、温度以及SOC等数据采集,计算进而控制电池的充放电过程,主要就是为了能够提高电池的利用率,防止电…

【Python从入门到进阶】51、电影天堂网站多页面下载实战

接上篇《50、当当网Scrapy项目实战(三)》 上一篇我们讲解了使用Scrapy框架在当当网抓取多页书籍数据的效果,本篇我们来抓取电影天堂网站的数据,同样采用Scrapy框架多页面下载的模式来实现。 一、抓取需求 打开电影天堂网站&…

Ubuntu Desktop 更改默认应用程序 (Videos -> SMPlayer)

Ubuntu Desktop 更改默认应用程序 [Videos -> SMPlayer] References System Settings -> Details -> Default Applications 概况、默认应用程序、可移动介质、法律声明 默认应用程序,窗口右侧列出了网络、邮件、日历、音乐、视频、照片操作的默认应用程序…

OCR如何解决字体多样性难题?

OCR(Optical Character Recognition,光学字符识别)技术的确是一项非常实用的技术,能够将图像中的文字转化为可编辑的文本,大大提高了工作效率。然而,你所遇到的问题——字体多样性导致的模型泛化能力不足&a…

AtCoder Regular Contest 175(A~B)

补题:A - Spoon Taking Problem 阅读理解就能劝退好多人,先看B题可能收益会更高。 N个人都是这么坐的,勺子标号也给你标好了。 如果 s[1]L,那么1这个人就要拿左边的勺子,如果左边没有就拿右边的,右边也没…

[AutoSar]BSW_ OS CORE, Physical core,EcuC core,EcuC partition,OSApplication的关系

目录 关键词平台说明一、总体依赖关系二、相关概念三、在配置中的实现3.1 EcucPartition3.2 OsApplication3.3 Ecu core 关键词 嵌入式、C语言、autosar、OS、BSW 平台说明 项目ValueOSautosar OSautosar厂商vector , EB芯片厂商TI 英飞凌编程语言C,C…

Centos7 防火墙iptables?

Centos7 防火墙iptables? 文章目录 Centos7 防火墙iptables?1. 介绍2. firewalld 和 iptables区别3. 区域管理概念区域管理有如下几种不同的初始化区域: 4.iptables的配置1.简述2.基本原理3.iptables传输数据包的过程4. iptables规则表和链5.…

C++初阶:STL容器list的使用与初版自实现

目录 1. list的接口与使用1.1 默认成员函数1.2 迭代器与容量相关成员函数1.3 存储数据操作相关成员函数1.4 其他list操作成员函数 2. list的自实现2.1 list的自实现功能2.2 list的结点结构2.3 list的迭代器2.3 list的结构2.4 list迭代器的运算符重载2.5 list的成员函数 3. cons…

python绘图matplotlib——使用记录2

本博文来自于网络收集,如有侵权请联系删除 三维图绘制 1 三维散点图2 三维柱状图三维曲面 1 三维散点图 import matplotlib.pyplot as plt import numpy as npfrom mpl_toolkits.mplot3d import Axes3Dfig plt.figure() # ax fig.gca(projection"3d")…

javase day11笔记

第十一天课堂笔记 构造代码块 { } 给 所有对象 共性特点 进行初始化操作 创建对象时在堆区对象中存放实例变量,同时执行构造代码块 执行顺序:静态代码块—>非静态代码块—>构造方法 继承★★★ 将多个类中相同的实例变量和实例方法 , 单独存放到一个类中,成为父类…

【Linux】写个日志和再谈线程池

欢迎来到Cefler的博客😁 🕌博客主页:折纸花满衣 🏠个人专栏:信号量和线程池 目录 👉🏻日志代码Log.cppMain.cc 👉🏻线程池代码LockGuard.hpp(自定义互斥锁,进…

网易web安全工程师进阶版课程

课程介绍 《Web安全工程师(进阶)》是由“ i春秋学院联合网易安全部”出品,资深讲师团队通过精炼的教学内容、丰富的实际场景及综合项目实战,帮助学员纵向提升技能,横向拓宽视野,牢靠掌握Web安全工程师核心…

Python6:Socket编程初步学习笔记

Socket协议概要 创建socket的时候,需要一些选项来说明本次使用协议具体是什么,常用的两个: 由此产生的不同组合: 但目前TCP(IPV4)是主流,SOCK_STREAMAF_INET 创建和使用Socket socket模块中有socket类&#xff1a…

51单片机学习笔记——LED闪烁和流水灯

任务分析 首先要知道LED闪烁主要是怎么工作的,闪烁亮灭自然是一下为高一下为低,亮灭的频率则需要延时来进行控制。 上节已经知道了如何点亮那延时如何做呢首先先编写主框架 这样是否可以通过循环将LED灯一直循环闪烁。 以为while一直在循环所以其实是可…

向开发板上移植ip工具:交叉编译 ip工具

一. 简介 前面几篇文章学习了 CAN设备节点的创建,以及如何使能 CAN驱动。 本文学习向开发板上移植ip工具。 二. 向开发板上移植ip工具:交叉编译 ip工具 注意:在移植 ip 命令的时候必须先对根文件系统做个备份!防止操作失误导…