MQ第②讲~保证消息可靠性

news2024/11/16 11:47:25

前言

上一讲我们讲了MQ实际工作中常见的应用场景,这一节讲一下消息的可靠性,如果对MQ掌握程度比较高的铁子,可以不用看,节省您宝贵的时间。

消息的大致链路

消息从投递到消费需要考虑如下几个问题

  • 生产者的消息是否成功投递到消息队列?
  • 消息队列的消息会不会丢失?(MQ宕机的情况
  • 消费者能否一定能消费到消息?
  • 消息异常重试,是否考虑幂等性?
  • 消息执行的结果异常,有没有补偿的方案?

以上这几点是使用MQ队列必须考虑的情况,尤其是商业项目,你要做好周密的方案,因为你的消息对于公司来说其实都是数据资产,比如广告行业的pv信息,广告一般计费都是按照pv计价的,消息丢失那就是严重的生产事故。

举例说明

业务场景

电商场景中,用户下单消费成功后,给用户增加对应的奖励积分,因为消费扣款是主业务,送积分其实并不是主流程业务,所以可以通过MQ进行异步处理。下面会介绍4种消息投递的方式,看看这个业务中消息投递的一个过程,我们一起对比一下他们可能存在的问题以及最终比较好的可取的方案。

方案① 在业务事务中投递消息

方案1大致步骤

可能出现异常的情况:

情况(1)

步骤③出现异常,消息投递失败,因为开始了事务,这样会导致订单生成失败,就直接影响到业务主流程;

情况(2)

步骤④发生异常,其他步骤成功:商品下单失败,消息投递成功,给用户增加了积分;因为电商的积分一般是可以兑换东西的,所以间接性地也是造成了损失,虽然不是致命的,还是不可取。

方案② 先进行主业务事务的提交,再进行消息投递

方案2大致步骤

这个顺序的话,如果步骤④发生异常,其他步骤成功:导致商品下单成功,投递消息失败,用户未增加积分,这给用户会造成不好的体验感,这种方式也不可取。

方案③ 事务消息(分两阶段投递)

(1)新建一张消息记录表(order_message_record)

假设这张表有以下几个字段id, order_no,status(默认值是0,表示消息待投递),content

(2) 流程如下

方案3大致步骤

(3)方案说明

这种方式借助了数据库的事务,业务和消息记录作为了一个原子操作,业务成功之后,消息记录必定是存在的。

(4)可能出现的异常情况

若步骤④执行成功,步骤⑤失败了,会导致业务执行成功,而消息投递失败,这样用户购物完,说好的送积分却没送,体验感就不好了,此时我们需要有个job对待发送的消息进行补偿投递。

(5)消息补偿措施

这个job负责从order_message_record表中查询出状态为0记录,重新投递。

对于投递失败的,采用衰减的方式进行重试,比如第1次失败了,则10秒后,继续重试,若还是失败,则再过20秒,再次重试,需要设置一个最大重试次数,最终还是投递失败,则需要告警+人工干预。

这种方案可靠性会相对高一些,成本其实就是消耗一些服务器的资源。还算可以接受。

方案④ 独立拆分消息服务

单独拆分一个消息服务,对于商业项目而言,需要用到MQ的场景一般会比较多。单独新建一个消息服务,负责消息的落库、将消息发送投递到mq,注意这里新增的一个消息服务可以是一个SpringBoot应用。

  • (1) 新建一个消息日志表

假设表名叫order_message_log

  • (2)新建一个消息表

假设表名叫做order_message_record,有如下几个字段

id:主键,消息id
msg_log_id:业务方order_message_log表的id
body:消息体
msg_log_url:业务方order_message_log记录回查的接口
status:状态,0:待投递,1:投递成功,2:投递失败
fail_msg:投递失败原因
  • (3)大致流程

方案4大致步骤

  • (4)可能出现的问题

若步骤⑥失败,消息服务order_message_record表中的这条消息,将处于待发送状态,但是业务库订单已经生成了,以及order_message_log表也是有记录的,对于这种情况,消息服务需新增一个job,对于order_message_record表中记录为0的消息,拿到order_message_record表中的msg_log_id去回查msg_log_url这个接口,去查一下业务库中的t_msg_log 表是否有记录,有记录说明业务是执行成功的,此时消息服务补发消息到MQ就可以了;对于回查不到的,有可能业务方本地事务还未提交,不能认定为业务方本地事务执行失败了,建议隔一段时间之后,再清理下这种消息。

如何确保消息到达MQ后,在MQ这边不会丢失?

  • 有些MQ为了性能,收到消息后,会将消息放在内存中,并没有立即持久化到磁盘,此时MQ挂了,消息会丢失。

  • 若要确保MQ收到消息后,消息不会丢失,则收到投递过来的消息后,立即持久化,这个操作基本上所有的MQ都是支持的,使用的时候配置一下就可以了。

    说明: 这个其实是运维干的事情,但是自己搞事情的话,那就得自己干了,其实也是基础知识,一般是安装MQ的时候进行配置一下即可

  • 为了防止MQ单节点故障,MQ还需要做主备,这样才可以最大限度的确保消息不会丢失。

消费者如何确保消息一定会被消费?

消息消费的大致流程

消费者消费消息,涉及到网络通信,网络通信存在不可靠的因素,可能会失败,导致消息没有被接收或者消费者消费之后没有进行确认,就会出现该消息再次消费的情况,所以需要做幂等处理,这种方式可以确保消息必然会被成功消费一次,并且就算被多次消费,结果也要是一致的。

写在最后

以上就是关于消息可靠性知识点的讲解,面试的时候,其实理解这一些也差不多了,实际业务万变不离其中,也没有说本文就是最优解,只要是能做到消息的可靠性保证就行,当然性能、数据存储这些都是成本的一部分,所以多思考一些情况总是好的,尤其是你自己搞事情的时候,缜密的思维可以让你省不少钱,我们团队的财经号"韭盾",因为每天要处理非常多的数据,保证为我们的用户每天可以收到最新的数据,MQ这一块真的很关键。对钱感兴趣的铁子可以微信搜索“韭盾”公众号,好了,今天的内容就先分享到这里了,咱们下期再见,这个专栏会继续更新。See you later。

在这里插入图片描述

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

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

相关文章

mac安装的VMware虚拟机进行桥接模式配置

1、先进行网络适配器选择,选择桥接模式 2、点击网络适配器 设置... 3、选择WiFi(我使用的是WiFi,所以选择这个),注意看右边的信息:IP和子网掩码,后续配置虚拟机的ifcfg-ens文件会用到 4、编辑if…

HarmonyOS-9(stage模式)

配置文件 {"module": {"requestPermissions": [ //权限{"name": "ohos.permission.EXECUTE_INSIGHT_INTENT"}],"name": "entry", //模块的名称"type": "entry", //模块类型 :ability类型和…

小迪和小捷的太空之旅——海底观光篇

书接上回,小迪和小捷来到了美丽的海底世界~

第三方软件测试机构进行验收测试的好处分享,需多少时间和费用?

在软件开发过程中,软件验收测试是不可或缺的一环。那么,什么是软件验收测试呢?为什么建议选择第三方软件测试机构进行验收测试呢? 软件验收测试是指在软件开发完毕后,由测试人员基于软件需求规格说明书和软件设计文档等材料,对…

【深度学习】吸烟行为检测软件系统

往期文章列表: 【YOLO深度学习系列】图像分类、物体检测、实例分割、物体追踪、姿态估计、定向边框检测演示系统【含源码】【深度学习】YOLOV8数据标注及模型训练方法整体流程介绍及演示【深度学习】行人跌倒行为检测软件系统【深度学习】火灾检测软件系统【深度学…

AcWing 1600:完全二叉树

【题目来源】https://www.acwing.com/problem/content/1602/【题目描述】 给定一个树,请你判断它是否是完全二叉树。【输入格式】 第一行包含整数 N,表示树的结点个数。 树的结点编号为 0∼N−1。 接下来 N 行,每行对应一个结点,并…

查看和修改自己的git提交时的作者信息

首先查看自己本地配置的信息:git config --list 修改姓名和邮箱: 配置用户名 git config --global user.name "真实姓名" 配置邮箱 git config --global user.email "公司分配的企业邮箱" 示例 git config --global user.name "张三" git…

linux网络项目——基于WebServer的工业数据采集项目

一、项目目标和框图 项目目标:实现通过网页控制信息采集和通过网页控制灯泡和蜂鸣器的亮灭 二、项目分析 1.服务器源码分析 初始化服务器循环等待连接,连接后创建线程,调用线程函数msg_request,在函数中调用handler_msg函数分析…

AI大模型探索之路-实战篇10:数据预处理的艺术:构建Agent智能数据分析平台的基础

系列篇章💥 AI大模型探索之路-实战篇4:深入DB-GPT数据应用开发框架调研 AI大模型探索之路-实战篇5:探索Open Interpreter开放代码解释器调研 AI大模型探索之路-实战篇6:掌握Function Calling的详细流程 AI大模型探索之路-实战篇7…

Web开发中,就session和cookie相比,用session比用cookie的优点有哪些?

在Web项目中,session和cookie都是用于存储用户数据的机制,但它们有不同的优缺点。使用session比使用cookie有以下几个主要优点: 1. 安全性更高 敏感数据保护:Session数据存储在服务器端,而不是客户端。这样&#xff…

什么叫USDT(泰达币)的前世今生!

一、引言 在数字货币的世界里,USDT(Tether USDT)以其独特的稳定机制,成为了连接传统金融市场与加密货币市场的桥梁。本文将带您了解USDT的诞生背景、发展历程、技术特点以及未来展望。 二、USDT的诞生背景 USDT是Tether公司推出…

QT::QNetworkReply类readAll()读取不到数据的可能原因

程序中,当发送请求时,并没有加锁,而是在响应函数中加了锁,导致可能某个请求的finished信号影响到其他请求响应数据的读取 connect(reply,&QNetworkReply::finished,this,&Display::replyFinished);参考这篇文章&#xff…

5.28.1 使用卷积神经网络检测乳腺癌

深度学习技术正在彻底改变医学图像分析领域,因此在本研究中,我们提出了卷积神经网络 (CNN) 用于乳腺肿块检测,以最大限度地减少手动分析的开销。CNN 架构专为特征提取阶段而设计,并采用了更快的 R-CNN 的区域提议网络 (RPN) 和感兴…

windows镜像虚拟机创建共享文件夹详细步骤 -- 和本地电脑传输文件

第一步:关闭客户机 第二步:右击“虚拟机名称”或菜单栏的“虚拟机”–>“设置” 网络适配器选择NAT或者其他的都可以 来到“选项”,启用共享文件夹,具体如下图:点击添加,添加主机文件夹。然后确定 第三步…

第3章 数据链路层

王道学习 考纲内容 (一)数据链路层的功能 (二)组帧 (三)差错控制 检错编码;纠错编码 (四)流量控制与可靠传输机制 流量控制、可靠传输与滑动窗口…

怎么藏族翻译中文在线翻译?更好地了解藏族文化

怎么藏族翻译中文在线翻译?着全球化的发展,语言交流的重要性日益凸显。藏族,作为中国的一个古老而神秘的民族,其语言对于很多人来说充满了神秘感。然而,在今天的数字化时代,我们有了更多的工具来打破语言壁…

Pytorch-Reduction Ops

文章目录 前言1.torch.argmax()2.torch.argmin()3.torch.amax()4.torch.amin()5.torch.all()6.torch.any()7.torch.max()8.torch.dist()9.torch.logsumexp()10.torch.mean()11.torch.norm()12.torch.nansum()13.torch.prod()14.torch.cumsum()15.torch.cumprod() 前言 1.torch.…

Vue 实例

一、页面效果图 二、代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><script src"../vue.js" type"text/javascript"></script><title>vue 实例</title></head><body>&l…

Jmeter 安装教程:简单易懂

随着互联网的不断发展&#xff0c;网站和应用程序的性能测试变得越来越重要。Apache JMeter 是一款广泛使用的性能测试工具&#xff0c;它强大且使用广泛&#xff0c;适用于各种性能测试需求。不论你是刚刚接触性能测试的新手&#xff0c;还是一位有经验的测试工程师&#xff0…

【ORB_SLAM系列3】—— 如何在Ubuntu18.04中使用自己的单目摄像头运行ORB_SLAM3(亲测有效,踩坑记录)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、ORB_SLAM3源码编译二、ORB_SLAM3实时单目相机测试1. 查看摄像头的话题2. 运行测试 三. 运行测试可能的报错1. 报错一(1) 问题描述(2) 原因分析(3) 解决 2. …