企业中订单超时关闭是怎么做的?我说用延迟消息,面试官让我回去等消息?

文章目录

  • 背景
  • 时序图
  • 方案对比
    • 方案一 被动关闭
    • 方案二 定时关闭
    • 方案三 Rocket MQ延迟消息
  • 总结

背景

订单超时未支付是电商中的一个核心场景,当用户创建订单后,超过一定时间没有支付,平台需要及时将该订单关闭。需要关闭的主要原因有以下几个:

  1. 提高交易效率:自动取消未支付的订单可以迅速释放被锁定的商品库存,商品能重新上架销售,提高商品周转率和销售效率。
  2. 优化用户体验:对于消费者而言,自动退款减少了手动取消的操作步骤,提升了购物体验。
  3. 管理库存准确性:避免因长时间占用库存而导致的真实库存与系统显示不符,减少因库存问题引发的订单履行错误。
  4. 防止恶意下单:防范恶意用户通过大量下单但不支付来占用商品库存,干扰正常销售。
  5. 资金流动与会计清晰:自动退款有助于电商平台和卖家及时处理财务事务,明确账目,避免长期挂账带来的财务管理复杂性。

时序图

增加时序图的原因是为了更好的理解后续各个方案的优缺点,另外是可以看的更清晰,便于理解。我们的场景是用户没有做完成支付这个步骤,也就是下图右侧的流程。
image.png

方案对比

方案一 被动关闭

主要看红框中的内容,与上方时序图的区别

被动关闭简单说就是依赖用户。这个方案在用户每次访问订单详情时,在订单详情接口中进行逻辑判断,支付是否超时,超时则关闭订单。时序图如下:
image.png
这个方案的优点只有一个,那就是不用开发自动关单的功能,只要查询订单详情接口加一些逻辑即可。缺点确实有很多:

  1. 用户永远不过来点详情:这种情况订单就会一直处于待支付的状态,相当恐怖兄弟,相当于有一个库存一直被锁着。
  2. 查询接口变得不单一:查询订单详情是一个查询接口,如果处理超时未支付时,就会引入写操作,个人认为是不太合适的

方案二 定时关闭

主要看红框中的内容,与上方时序图的区别

定时关闭一般都是通过xxl-job(分布式调度平台)来实现的。处理的逻辑是:

  1. 定时任务查询超时未关闭的订单(注意这里扫出来的订单全部都需要关闭,后续与MQ关单方案对比
  2. 订单服务只返回订单号列表(只返回订单号,不用回表)
  3. 遍历订单号列表,发送关单MQ消息

image.png
定时任务关闭个人非常推荐,非大厂的情况下,这个方案感觉是最优方案。原因是:

  1. 大部分公司的订单里其实并不大
  2. 超时不支付的订单非常少,大家想想自己买了不想要的东西是不是会立即点取消支付
  3. 查询的时候有索引,不回表
  4. 订单量中等的情况,可以读写分离,扫从库不会对业务造成影响

但是定时任务扫表的缺点也是有的:

  1. 性能瓶颈与资源消耗:这种场景在扫主库的前提下是有影响的,集中式的查询一堆数据,会占用数据大量的IO资源,由于读写共享的是一个主库,集中式的读会让数据库的响应变慢,肯定对业务是有影响的
  2. 实时性问题:简单说就是没办法保证及时的退款。假设超时未支付的时间是30分钟,但是定时任务5分钟跑一次,也就是说这个单子可能在下单30~35分钟后执行退款,与我们期望的下单后30分钟退款不一致

人非常推荐使用该实现方案,原因很简单实时性的问题我们可以改成1分钟,缩短定时任务的频率;资源消耗的问题在超时单量不是特别多的情况下,其实产生的影响不大,这个场景扫的不是全表。

方案三 Rocket MQ延迟消息

主要看红框中的内容,与上方时序图的区别

目前MQ最常见时RocketMQ,所以消息队列以RocketMQ为例,像RabbitMQ也有类似的功能死信队列这里不展开讨论。处理的逻辑是:

  1. 下单后异步发送延迟消息
  2. 延迟消息到延迟时间,消息投递到队列,消费者此时可以拉到该消息
  3. 判断订单是否完成支付,完成这不需要任何处理

image.png
Rocket MQ的好处是可用性非常高,RocketMQ本身有重试机制,能保证消息失败后的重试。从实际情况看,不是高峰的情况下,基本不会出现消息消费失败的情况。但是这个方案有个明显的缺点是有大量无效的调度,可以看到这个方案所有的订单都会去发送一个延迟消息,但是实际场景100个订单都不一定有一个超时未支付的订单。

总结

以上方案算是比较常见的方案,还有其他方案比如JDK自带的内存队列,Redis过期监听等大家可以去看看。以上方案个人推荐方案二定时任务,具体采用那种方案还是要根据业务情况来,毕竟技术是为了赋能业务,能解决问题就行,做完比完美更重要。

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

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

相关文章

【database1】mysql:DDL/DML/DQL,外键约束/多表/子查询,事务/连接池

文章目录 1.mysql安装:存储:集合(内存:临时),IO流(硬盘:持久化)1.1 服务端:双击mysql-installer-community-5.6.22.0.msi1.2 客户端:命令行输入my…

RTSP协议分析与安全实践

RTSP协议,全称实时流协议(Real Time Streaming Protocol),前文已经简单介绍了RTSP相关协议; RTSP和RTP(RTCP) 这里再提一下RTSP和RTP/RTCP、RSVP的关系;如图: RTSP和HTTP 相似性:RTSP和HTTP协议都使用纯…

Android,RPC原理,C语言实现Binder跨进程通信Demo

RPC原理图 Binder C语言层的Demo演示 新建目录 把两个文件拷贝到我们的Demo下面 1.binder_server.c #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <linux/types.h> #include <stdbool.h> #include <string.h> #…

多路h265监控录放开发-(12)完成全部开始录制和全部停止录制代码

xviewer.h 新增 public: void StartRecord();//126 开始全部摄像头录制 void StopRecord();//126 停止全部摄像头录制 xviewer.cpp 新增 //视频录制 static vector<XCameraRecord*> records;//126void XViewer::StartRecord() //开始全部摄像头录制 126 {StopRecord…

基于JSP的“塞纳河畔左岸”的咖啡馆管理系统

开头语&#xff1a; 塞纳河畔左岸的咖啡&#xff0c;我手一杯品尝的你美~ 哎哟&#xff0c;不错哦&#xff01;我们今天来介绍一下咖啡馆管理系统&#xff01; 你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果你对咖啡馆管理系统感兴趣或有相关需求&#xff0c;欢迎联…

AGV机器人的调度开发分析(1)- 内核中的路线规划

准备开始写一个系列&#xff0c;介绍下AGV机器人的调度的开发和应用。 按照openTCS的核心内容&#xff0c;国内多家广泛应用于AGV的调度。那么架构图如下&#xff1a; Kernel中有一个是Routing&#xff0c;这是路由规划模块&#xff0c;需要实现的细节功能包括如下&#xff1a…

Django 模版转义

1&#xff0c;模版转义的作用 Django模版系统默认会自动转义所有变量。这意味着&#xff0c;如果你在模版中输出一个变量&#xff0c;它的内容会被转义&#xff0c;以防止跨站脚本攻击&#xff08;XSS&#xff09;。例如&#xff0c;如果你的变量包含HTML标签&#xff0c;这些…

长亭谛听教程部署和详细教程

PPT 图片先挂着 挺概念的 谛听的能力 hw的时候可能会问你用过的安全产品能力能加分挺重要 溯源反制 反制很重要感觉很厉害 取证分析 诱捕牵制 其实就是蜜罐 有模板直接爬取某些网页模板进行伪装 部署要求 挺低的 对linux内核版本有要求 需要root 还有系统配置也要修改 …

网络编程篇:HTTP协议

一.预备知识 在客户端访问服务端时&#xff0c;要用ipport&#xff0c;但是在日常用户访问服务端的时候&#xff0c;并不会直接使用ip&#xff0c;而是使用域名&#xff0c;比如&#xff1a;百度(www.baidu,com)。 …

智能优化算法改进策略之局部搜索算子(八)--Powell方法

1、原理介绍 Powell方法[1]是一种无约束优化算法&#xff0c;又称为方向加速法&#xff0c;用于寻找多变量函数的极小值。其基本思想是在迭代中逐次产生Q共轭方向组&#xff0c;本质上它属于不需计算导数的共轭方向法。每次迭代后&#xff0c;算法会更新搜索方向&#xff0c;并…

Java内存泄漏检测和分析介绍

在Java中&#xff0c;内存泄漏检测和分析是一个重要的任务&#xff0c;可以通过以下几种方式进行&#xff1a; 1. 使用VisualVM VisualVM是一个可视化工具&#xff0c;可以监控、分析Java应用程序的内存消耗。它可以显示堆内存、垃圾收集、线程等信息&#xff0c;并且可以对内…

英伟达下一代DLSS或利用人工智能

英伟达的黄仁勋在2024年Computex展会上的问答环节中&#xff0c;提前透露了公司未来几代深度学习超采样&#xff08;DLSS&#xff09;技术的发展方向。在回答有关DLSS的问题时&#xff0c;黄仁勋表示&#xff0c;未来我们将看到通过纯粹的人工智能生成的纹理和对象。他还提到&a…

构建下一代数据解决方案:SingleStore、MinIO 和现代 Datalake 堆栈

SingleStore 是专为数据密集型工作负载而设计的云原生数据库。它是一个分布式关系 SQL 数据库管理系统&#xff0c;支持 ANSI SQL&#xff0c;并因其在数据引入、事务处理和查询处理方面的速度而受到认可。SingleStore 可以存储关系、JSON、图形和时间序列数据&#xff0c;以满…

AI 大模型企业应用实战(13)-Lostinthemiddle长上下文精度处理

1 长文本切分信息丢失处理方案 10检索时性能大幅下降相关信息在头尾性能最高检索 ->> 排序 ->使用 实战 安装依赖&#xff1a; ! pip install sentence-transformers 演示如何使用 Langchain 库中的组件来处理长文本和检索相关信息。 导入所需的库使用指定的预训…

(4) cmake编译静态库和动态库

文章目录 静态库整体代码动态库编译整体代码执行结果(静态) 静态库整体代码 static.h #pragma onecevoid static_demo();static.cpp #include "static.h" #include <iostream>void static_demo(){std::cout<<"static demo"<<std::end…

Posix多线程编程总结

Posix在线文档&#xff1a; The Single UNIX Specification, Version 2 (opengroup.org) 本文主要参考这位大神的文章&#xff1a; Posix多线程编程学习笔记 - 凌峰布衣 - 博客园 (cnblogs.com) 线程安全问题 多线程编程中&#xff0c;经常遇到的就是线程安全问题&#xff0c;或…

PINN解偏微分方程实例4

PINN解偏微分方程实例4 一、正问题1. Diffusion equation2. Burgers’ equation3. Allen–Cahn equation4. Wave equation 二、反问题1. Burgers’ equation3. 部分代码示例 本文使用 PINN解偏微分方程实例1中展示的代码求解了以四个具体的偏微分方程&#xff0c;包括Diffusio…

第T2周:彩色图片分类

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 &#x1f449; 要求&#xff1a; 学习如何编写一个完整的深度学习程序了解分类彩色图片会灰度图片有什么区别测试集accuracy到达72% &#x1f9be;我的环境&am…

测试测量-DMM直流精度

测试测量-DMM直流精度 最近去面试&#xff0c;发现了自己许多不足&#xff0c;比如我从未考虑过万用表准或者不准&#xff0c;或者万用表有多准&#xff1f; 在过去的实验室中&#xff0c;常用的DMM有KEYSIGHT 34401A以及 KEITHLEY THD2015&#xff0c;就以这两台为例&#x…

线程C++

#include <thread> #include <chrono> #include <cmath> #include <mutex> #include <iostream> using namespace std;mutex mtx; void threadCommunicat() {int ans 0;while (ans<3){mtx.lock();//上锁cout << "ans" <…