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

前言

上一讲我们讲了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。

在这里插入图片描述

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

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

相关文章

隐藏在OceanBase ODC中的运维神器

近期OceanBase 的ODC 推出的新版 v4.2.4中,提供了内置运维代码,让我们一起来看看吧。 DBA 可能会喜欢的功能 查看集群可用的资源 统计数据库内表的数据大小 用 SQL 创建租户不再复杂 请注意,在修改租户名字时,unit config和reso…

2024 最新版 Navicat 17 下载与安装步骤及演示 (图文版)

Navicat 是一款专业的数据库管理工具,支持多种数据库类型,包括 MySQL、Oracle、SQL Server、PostgreSQL、MariaDB、Redis、MongoDB 和 SQLite。Navicat17包含的版本如下Navicat Premium 17, Navicat 17 for MySQL, Navicat 17 for Oracle, Navicat 17 fo…

记录使用自定义编辑器做试题识别功能

习惯了将解析写在代码注释,这里就直接上代码啦,里面用到的bxm-ui3组件库是博主基于element-Plus做的,可以通过npm i bxm-ui3自行安装使用 // 识别方法: // dom 当前识别数据所在区域, questionType 当前点击编辑选择的题目类型&a…

Java设计模式 _行为型模式_观察者模式

一、观察者模式 1、观察者模式 观察者模式 ( Observer Pattern )是一种行为型模式。 常用于对象间存在一对多关系时,比如,当一个对象被修改时,需要自动通知它的依赖对象。 2、实现思路 (1)、定义被观察者的行为&…

Kafka原生API使用Java代码-生产者-发送消息

文章目录 1、生产者发送消息1.1、使用EFAK创建主题my_topic31.2、根据kafka官网文档写代码1.3、pom.xml1.4、KafkaProducer1.java1.5、使用EFAK查看主题1.6、再次运行KafkaProducer1.java1.7、再次使用EFAK查看主题 1、生产者发送消息 1.1、使用EFAK创建主题my_topic3 1.2、根…

c++(六)

c(六) 多态概念在c中是如何实现多态静态多态(绑定)动态多态(绑定) 动态多态的实现原理动态内存分配中遇到的问题 重载、重定义、重写的区别抽象类接口类---抽象类空类对象的内存大小explicitfinal修饰类修饰…

稳定性大升级!EMCS全球服务网络携手NineData实现数据实时同步

易客满(ECMS Express)专注于提供全球化的国际物流解决方案和经济快递服务,服务网络覆盖全球主要贸易市场的国际物流公司。ECMS拥有国际快递、国际货代、仓储供应链全球覆盖服务能力。 1. 易客满(ECMS)数据复制的技术挑…

SOLIDWORKS 2024:零件亮点的升级与突破

随着科技的不断发展,工程设计软件也在持续进步,以更好地满足工程师和设计师的需求。SOLIDWORKS,作为一款广泛使用的三维CAD软件,一直在不断地推出新版本,以提供更强大、更便捷的功能。今天,我们将深入探讨S…

高边坡监测常用的主要仪器设备

随着人类的发展,近几年由于人类生活生产的破坏,地球环境不断恶化。鉴于这一现象,监测行业也随之应运而生。常见的监测类型有:边坡监测,地灾监测,水库监测,大坝监测,矿山监测&#xf…

geotrust通配符证书600元且赠送一个月

GeoTrust作为国际知名的数字证书颁发机构,旗下有RapidSSL、QuickSSL等子品牌经营着各种类型的SSL数字证书,其中RapidSSL旗下的SSL数字证书都是入门级的,性价比高。审核速度也比较快,证书的适用范围也比较广泛。今天就随SSL盾小编了…

HarmonyOS-9(stage模式)

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

【Python Cookbook】S01E02 从任意长度的可迭代对象中分解元素

目录 问题解决方案讨论 问题 从某个不确定长度的迭代对象中分解出 N N N 个元素。 解决方案 *分解操作和各种函数式语言中的列表处理功能有着一定的相似性。例如,如果有一个列表,可以像下面这样轻松将其分解为头部和尾部。 scores [99, 97, 91, 89…

CHIMA专访美创高级总监丁斐:为医疗数据安全构筑体系化防御新机制

5月17-19日,中国医院信息网络大会(CHIMA 2024)在南京隆重召开。作为结识多年的老友,美创科技再携以数据为中心的全系列安全业务、新一代数字化安全平台、医疗行业解决方案精彩亮相。 会议期间,CHIMA专访美创科技&…

金融反欺诈指南:车险欺诈为何如此猖獗?

目录 车险欺诈猖獗的原因 车险欺诈的识别难点 多重合作打击车险欺诈 保险企业需要提升反欺诈能力 监管部门需要加强协同合作 青岛市人民检察院在其官方微信公众号上发布的梁某保险诈骗案显示,2020 年以来,某汽修厂负责人梁某、某汽车服务公司负责人孙某&…

精通推荐算法7:多任务学习 -- 总体架构

1 多任务学习的总体架构 目前的互联网主流推荐场景在大多数情况下需要优化多个业务目标。例如在淘宝商品推荐中,需要兼顾点击率和转化率。在抖音短视频推荐中,需要考虑完播率、播放时长、点赞率、评论率、关注率等目标。为了提升各项业务目标&#xff0…

光栅幅值细分原理与实现

本文介绍光栅幅值细分原理与实现。 光栅是工业测量领域中常见的传感器,如下图。主要厂家有雷尼绍,海德汉,配套的光栅读数头有模拟信号的,也有直接细分输出数字脉冲的,本文的细分针对模拟信号,即有正弦信号…

数字化业务流程升级再造,解困基本半导体的CRM应用5年之痒

在新能源汽车、工业互联、5G通信、消费电子等需求的强力拉动下,以碳化硅为代表的第三代半导体产业迎来爆发式增长。 深圳基本半导体有限公司(以下简称“基本半导体”)是中国第三代半导体创新企业,专业从事碳化硅功率器件的研发与…

NineData 联合创始人周振兴将参加开源数据库技术沙龙,并和 PolarDB 开源社区一起去娃哈哈带来主题分享!

5月31日(周五),PolarDB 开源社区将联合娃哈哈集团共同举办开源数据库技术沙龙!NineData 联合创始人周振兴受邀参加,并将分享《NineData,Any to Any 数据复制之路》的技术分享。 本次活动汇聚了 PolarDB 产品…

用于水利工程系统方面的传感器M-A542VR10

近几年快速发展的IC技术和计算机技术,为传感器的发展提供了良好与可靠的科学技术基础。使传感器的发展日新月益,且数字化、多功能与智能化是现代传感器发展的重要特征爱普生也在不断发展自己的传感器型号。随着水利工程技术的不断进步,传感器…

面向对象编程:坦克飞机大战游戏的重构之旅

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、面向对象编程思想入门 坦克对象的定义 属性与行为方法的实现 二、面向过程与面向对象…