说说MQ在你项目中的应用(二)商品支付

看了不少关于MQ的文章,也对MQ的作用做了一些总结。通常来说MQ有三大功能:异步处理、系统解耦和流量削峰。但我觉得这些功能本质上都是围绕着异步这个核心来的,只是针对不同的业务场景做了些调整。

现在市面上常用的MQ中间件,如RabbitMQ、RocketMQ和Kafka,都是大家耳熟能详的。最近,Apache基金会推出的Pulsar也挺火的,口碑不错,只还差一些大项目实战来检验它。

如今,MQ在现在的项目里基本是标配了。这篇文章主要是梳理一下自己所在项目中是怎么用MQ的,复盘一下使用MQ的场景。

这里接上篇,此篇主要梳理的是支付订单的业务场景。

支付订单

1、场景描述

业务流程比较长, 和一般的订单业务有点不太一样的地方就是商品是由第三方系统制作的。

2、实现分解

业务分解
  1. 用户选择自己需要的商品及年限
  2. 系统根据用户选择,自动计算出价格及相关的信息展示给用户
  3. 用户确认后,提交订单,订单服务收到订单后存储在DB同时,给Rabbitmq发送支付任务。如果DB保存成功,MQ失败则重试,重试失败则转人工。
  4. 支付中心监听到支付消息,向第三方支付平台发起支付请求,第三方支付平台返回支付二维码
  5. 如果支付未完成或支付失败或不小心关闭支付页面,用户重新进入后可以重新扫码支付
  6. 用户扫码支付成功后,第三方支付平台异步通知支付结果,一般通知失败有多次重新通知的机制。比如支付宝:

在进行异步通知交互时,如果支付宝收到的应答不是 success,支付宝会认为通知失败,会通过一定的策略定期重新发起通知。重试逻辑为:当未收到success立即尝试重发 3 次通知,若 3 次仍不成功,则后续通知的间隔频率为:4m、10m、10m、1h、2h、6h、15h

当然有可能回调服务异常,调用方也可以去支付平台反查支付结果。

  1. 支付中心支付完成后,会向rabbitmq发送完成消息
  2. 商品服务收到消息后会向第三方发起调用商品生产的服务,生产完成后向rabbitmq发送商品制作完成消息
  3. 物流服务收到消息后调用第三方物流接口发起快递(之前下单用户已经填写物流信息),物流完成后,MQ通知订单服务。
  4. 订单服务收到后更新订单状态,完成订单。
优势分析

在此业务场景中,使用消息队列(RabbitMQ)具有以下优势和必要性:

  1. 解耦:RabbitMQ允许系统间的松耦合,例如,如果订单系统需要通知支付和物流服务,通过MQ,订单系统只需将消息发送到队列,而不必直接与其他系统通信。这样,即使业务流程发生变化,也不需要修改订单系统的代码。
  2. 异步处理:RabbitMQ支持异步通信,允许系统在处理长时间运行的任务时不阻塞用户请求。例如,用户下单后,订单系统可以立即响应,而支付和流程操作可以在后台异步进行。
  3. 削峰填谷:在高流量时段,RabbitMQ可以作为缓冲,接收突发的大量请求,然后慢慢地处理这些请求,避免直接压力过大导致系统崩溃。
  4. 可靠性和持久化:RabbitMQ可以保证消息的可靠传递,即使处理系统暂时不可用,消息也可以存储在队列中,待系统恢复后再进行处理。 MQ应答、持久化等机制可以保证整个业务的最终一致性。

3、小结

此业务场景选择RabbitMQ而非继续沿用之前搭建的Kafka,主要是基于对系统需求的深入分析。Kafka作为一款高性能的消息队列系统,其设计初衷是为了处理大规模数据流的高吞吐量场景。尽管Kafka同样具备低延迟和确保消息不丢失的特性,但在当前项目中,我们面临的是消息量相对较小,却对消息处理的实时性有较高要求的场景。

RabbitMQ,以其卓越的灵活性和低延迟特性,在此类场景下表现得更为出色。它能够提供毫秒级的消息传递延迟,并且通过其丰富的路由策略和消息确认机制,确保了消息传递的可靠性和准确性。因此,在综合考虑了系统的实际需求和两款消息队列产品的特性后,我们最终决定采用RabbitMQ来满足项目对低延迟和高可靠性的双重需求。

在下图可以看到低吞吐量的情况下,rabbitmq的延迟是最低的,对于延迟是越低越好。

此图来源于confluent.io

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

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

相关文章

Go语言之函数和方法

个人网站: http://hardyfish.top/ 免费书籍分享: 资料链接:https://url81.ctfile.com/d/57345181-61545511-81795b?p3899 访问密码:3899 免费专栏分享: 资料链接:https://url81.ctfile.com/d/57345181-6…

Java进阶-Lambda

Java进阶-Lambda 前言Lambda表达式什么是Lambda表达式初识Lambda表达式Lambda表达式的简单使用Lambda表达式格式分析与传统接口方法实现的比较 理解Lambda表达式函数式编程非纯函数实例纯函数示例函数式编程在Lambda表达式中的体现 闭包闭包与Lambda表达式的示例 类型推导-匿名…

【D3.js in Action 3 精译】1.2.2 可缩放矢量图形(一)

译注 由于 1.2.2 小节介绍 SVG 的篇幅过多,为了方便查阅,后续将分多个小节依次进行翻译。为了确保整个 1.2.2 小节的完整性,特意将上一篇包含的 SVG 小节的内容整理出来重新编排。敬请留意。 1.2.2 SVG - 可缩放矢量图形 可伸缩矢量图形&…

802.11漫游流程简单解析与笔记_Part2_02_wpa_supplicant、cfg80211、nl80211内核与驱动的关系

wpa、cfg80211、nl80211内核与驱动的关系示意图如下: nl80211和cfg80211都是内核定义的标准接口,目的是规范驱动和应用的统一调用,wpa中常出现nl80211就是通过内核的nl80211接口调用对应cfg80211的部分,进而控制驱动收发数据或切换…

实现高效写入:Schemaless 写入性能优化指南

物联网应用常常需要收集大量的数据,用以支持智能控制、业务分析和设备监控等功能。然而,应用逻辑的更新或硬件的调整可能会导致数据采集项频繁变化,这是时序数据库(Time Series Database,TSDB)面临的一大挑…

排序算法之java语言实现

零、说在前面 近期打算复习java的几种排序算法,我会将这些排序算法的实现代码、个人心得、时间复杂度分析,算法间的对比做成一个系列帖子,这里作为那些帖子的汇总而存在。 这个系列的框架会包含:概念、实现、时间空间复杂度…

50、基于NARX神经网络的磁悬浮建模(matlab)

1、NARX神经网络简介 NARX(非线性自回归外部输入)神经网络是一种用于非线性建模和预测的神经网络结构。与传统的自回归模型不同,NARX网络可以接收外部输入来影响输出结果,从而更好地捕捉系统的复杂性和非线性特征。 NARX神经网络…

为什么计算机中的无线网络被称为“Wi-Fi”?

在当今信息化社会中,无线网络已经成为我们生活中不可或缺的一部分。无论是家庭、办公室还是公共场所,我们都能享受到便捷的无线互联网连接。而当我们谈及无线网络时,一个经常听到的术语就是“Wi-Fi”。那么,为什么计算机中的无线网…

植物大战僵尸杂交版v2.1最新整合版,附PC端+安卓端+iOS端安装包+修改器+安装教程!

嘿,大家好,我是阿星,今天要跟大家聊聊一款游戏,它不是那种让人眼花缭乱的大制作,也不是那种能让人回味无穷的艺术作品,但它在阿星心里,绝对是神作中的佼佼者。没错,它就是《植物大战…

【windows】win11系统跳过联网和微软账户登录,实现本地账户登录

问题原因:现在市面上销售的品牌笔记本和台式机基本上都预装了正版的Windows S11家族中文版操作系统,联网后系统会自动激活。在win11的版本中,隐藏了关闭跳过连接网络的按钮,默认强制需要注册微软账户登录才能正常使用。 一、跳过…

动态规划——123. 买卖股票的最佳时机 III

目录 1、题目链接 2、题目分析 1.状态表示 2.状态转移方程 3.初始化 4.填表 5.返回值 3、代码解析 1、题目链接 123. 买卖股票的最佳时机 III 2、题目分析 1.状态表示 由题目可知,我们分为两种状态,买入和卖出,又因为只能完成两次交易…

MAC 查看公钥私钥

电脑配置过公钥私钥,现在需要查看: 1、 查看本地是否存在SSH密钥 命令:ls -al ~/.ssh 如果在输出的文件列表中发现id_rsa和id_rsa.pub的存在,证明本地已经存在SSH密钥,请执行第3步 2、 生成SSH密钥 命令&#xff1…

我的3次软考高项通关之旅

1、缘起 初次听说软考是在2022年下半年了,软考的高级分为很多种,我起先想报考高级架构师,但是架构师一年才考一次,如果一次考不过得再准备一年,时间对我来说太长了,于是我决定报考一年考两次的高项。对于国…

【Unity】RPG2D龙城纷争(六)关卡编辑器之角色编辑

更新日期:2024年6月26日。 项目源码:第五章发布(正式开始游戏逻辑的章节) 索引 简介一、角色编辑模式1.将字段限制为只读2.创建角色(刷角色)3.预览所有角色4.编辑选中角色属性5.移动角色位置6.移除角色 简介…

Linux OpenGrok搭建

文章目录 一、目的二、环境三、相关概念3.1 OpenGrok3.2 CTags3.3 Tomcat 四、OpenGrok搭建4.1 安装jdk4.2 安装ctags依赖4.3 安装universal-ctags4.3.1 下载universal-ctags4.3.2 编译&&安装universal-ctags 4.4 安装Tomcat4.4.1 下载&&解压Tomcat4.4.2 启动T…

HQChart使用教程30-K线图如何对接第3方数据41-分钟K线叠加股票增量更新

HQChart使用教程30-K线图如何对接第3方数据40-日K叠加股票增量更新 叠加股票叠加分钟K线更新Request 字段说明Data.symbol 协议截图返回json数据结构overlaydata HQChart代码地址交流 叠加股票 示例地址:https://jones2000.github.io/HQChart/webhqchart.demo/samples/kline_i…

泰迪智能科技大数据挖掘企业服务平台典型合作案例介绍

泰迪大数据挖掘企业服务平台 是一款通用的、企业级、智能化的数据分析模型构建与数据应用场景设计工具,能够一体化地完成数据集成、模型构建、模型发布,为数据分析、探索、服务流程提供支撑,提供完整的数据探索、多数据源接入、特征处理、模型…

软硬链接 以及 动静态链接

目录 1 软硬链接 2 动静态库 1 软硬链接 不知道大家也没有仔细看过我们的 windows 中的快捷方式的内容,我们右键点开一个快捷方式然后查看其属性,我们发现有一个 目标 的内容 这个目标是一串路径,这也就是我们的程序的安装路径中的一个.exe…

浅浅谈谈如何利用Javase+多线程+计算机网络的知识做一个爬CSDN阅读量总访问量的程序

目录 我们发现csdn的文章 首先为了印证我们的想法 我们用postman往csdn我们任意一篇文章发起post请求 发送请求 ​编辑获得响应结果 我们发现我们的阅读量上涨 PostRequestSender类 但是我们经过测试发现 定义一个字符串数组 把URL放进去 然后延迟启动 在线程池里面…

redis哨兵模式(Redis Sentinel)

哨兵模式的背景 当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式。 为了解决单点故障和提高系统的可用性,需要一种自动化的监…