【高并发项目实战】自适应高并发复杂场景的订单拆分算法工具

简介: ​本篇文章带你打造一个自适应场景的交易订单合单拆分通用算法方案,根据现有技术的痛点,我们支付的时候设计一种自适应场景的交易下单合单拆分通用算法的方案,可插拔的场景组件提升扩展性和通用性就很重要。

前言

📫作者简介小明java问道之路,专注于研究计算机底层/Java/Liunx内核,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计📫

🏆CSDN专家博主/Java领域优质创作者、阿里云专家博主、华为云享专家、51CTO专家博主🏆

🔥如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主~

本文导读

本篇文章带你打造一个自适应场景的交易订单合单拆分通用算法方案,根据现有技术的痛点,我们支付的时候设计一种自适应场景的交易下单合单拆分通用算法的方案,可插拔的场景组件提升扩展性和通用性就很重要。

一、 技术难点以及为什么一定要实现自适应场景

现有业内或产品是否有类似的,现有技术是否有缺陷或不足或问题,我们支付的时候

网络异常,图片无法展示
|

交易系统为满足企业生产、销售、服务等需要,信息化模型复杂;为应对运营、管理和决策从而业务变化快;需要应对多商业模式的场景,例如多供应商、自营模式、入驻模式等;运营系统多样性,如O2O/C2C/B2C/。

随着业务不断迭代,每增加一个场景或者一个交易支付工具,交易模型就成笛卡尔积形式增长,下单、支付退款、结算业务将越来越难以维护和扩展。如果不能有效控制和管理,后续扩展都需要不断重复的进行原有工作,导致业务代码冗余,逻辑不清晰,不能有效的保证数据一致性,也会带来代码效率和开发效率等问题。代码可读性变差,同逻辑不同实现代码性能参差不齐的问题。

网络异常,图片无法展示
|

针对以上问题,设计一种自适应场景的电商下单合单拆分通用算法的方案,设计根据下单场景自适应交易合单的拆分订单信息、结算信息,通过顺序表存储可插拔的场景组件提升扩展性和通用性,使用持久层提升代码执行逻辑效率和数据一致性。

二、交易模型设计原理

对于复杂的交易模型,此设计整体上分为4个模块——分摊模块、事件模块、服务模块、数据模

1、数据模块

将复杂的模型抽象化,保留交易类型、交易流水信息、订单商品信息,如需要扩展信息,可根据已知信息通过业务场景,在数据获取更多的信息。以统一的抽象数据模型应对多样的复杂的场景,场景动态扩展,程序通过策略选择,统一迭代来自适应复杂场景。

网络异常,图片无法展示
|

2、事件模块

事件体系是交易系统内部抽象模型,定义了一个唯一的事件ID,支持同步异步执行,具有配置持久化机制、自定义异常重试机制、自动触发机制、监控报警等特点,将复杂逻辑代码和交易业务代码解耦。

网络异常,图片无法展示
|

3、服务模块

将数据模块、交易拆分信息在提供服务之前完成持久化,提供统一通用的服务接口,避免数据不一致,提高下单、退款、清结算、金额/数量分摊的性能与一致性。

网络异常,图片无法展示
|

4、算法模块

总体基于事件模块自动执行,将数据模块信息拆分,内置支付工具模块可支持配置的所有工具扁平化处理,过滤仅使用的工具。拆分主体根据配置规则,按照商品总金额占比模式拆分,对复杂交易模式进行统一集中处理,对防资损使用拆分金额/数量恒等于交易金额/数量的方式,对异常处理具有失败重试、失败监控告警、异常捕获等措施。最终通过此模块,服务各类复杂订单拆分、不同场景拆分的能力。

网络异常,图片无法展示
|

5、整体设计

整体业务处理流程图,首先我们拿到用户的行为,例如:下单使用了支付宝+商家券+满减活动+618活动+花呗+银行卡,出去拆分下单落库,优惠券的核销使用,我们将拆分逻辑使用异步API-Future进行开发,首先将拆分事件定义为一个 event 事件,此事件保存在环形缓冲器(ring buffer)这么做为了可以循环执行添加的事件,无需阻塞,这个时候在事件里面,实现自适应的拆分逻辑,并将拆分逻辑提供对外的服务接口即可,当此事件执行异常时,会进行落库操作

网络异常,图片无法展示
|

三、交易模型设计代码实现

1、发布事件

Disruptor是一个高性能的异步处理框架,或者可以认为是线程间通信的高效低延时的内存消息组件,它最大特点是高性能,其LMAX架构可以获得每秒6百万订单,用1微秒的延迟获得吞吐量为100K+。disruptor设计了一种高效的替代方案,我们使用 disruptor.getRingBuffer(); 构件高并发容器

/**
     * 发布事件-异步执行
     *
     * @param orderEvent 事件
     * @param isAsync    true-异步 ,false-同步
     * @param context    上下文
     */
    @Override
    public void publishEvent(OrderEventBean orderEvent, Object context, boolean isAsync) {
        try {
            // 实时异步且异步事件可重复处理时事件入库+redis
            // 信息入redis
            // 执行异步事件
            if (isAsync) {
                RingBuffer<OrderEventBean> ringBuffer = disruptor.getRingBuffer();
                ringBuffer.publishEvent((event, sequence, groupId, orderId) -> ConvertBeanUtil.copyBeanProperties(orderEvent, event), orderEvent.getEventGroupId(), orderEvent.getOdrId());
            } else {
                // 执行同步事件
                logger.info("publishEvent方法orderEvent={}", orderEvent);
                EventProcessorUtil.run(orderEvent);
            }
        } catch (Exception e1) {
            logger.error("publishEvent error e1 =", e1);
        }
        logger.info("publishEvent end");
    }

2、逻辑模块

计算分摊数量工具的核心逻辑,分摊逻辑:单笔子单 支付方式 支付金额 / 该支付方式总订单积分支付金额 = 数量,最后一笔子单使用减法 (订单总数 - 分摊总数) = 剩余分摊数 < 最后一笔分摊数 ? 剩余分摊数 : 最后一笔分摊数主要流程:1、先对list<...Detail>根据优先级排序,2、按顺序分摊,不能超过剩余的总数量,最后一笔取剩余,退款不能超过交易,3、获取下单时的支付工具,4、计算

/**
     * 计算分摊数量的工具
     * 分摊逻辑:单笔子单 支付方式 支付金额 / 该支付方式总订单积分支付金额 = 数量
     * 最后一笔子单使用减法 (订单总数 - 分摊总数) = 剩余分摊数 < 最后一笔分摊数 ? 剩余分摊数 : 最后一笔分摊数
     */
    @Override
    public ForkQuantityDTO subOdrForkQuantityPayProcess(ForkQuantityDTO forkQuantityDTO) {
        // 1.先对list<...Detail>根据优先级排序
        // 2.按顺序分摊,不能超过剩余的总数量,最后一笔取剩余
        // 3.获取下单时的支付工具进行拆分
    }

四、设计亮点与好处

1、对拆分和服务逻辑做了解耦,将拆分模块化,解决了不同业务分摊的数据一致性问题,提高代码的可维护性可扩展性

2、自适应复杂的业务场景,支持对复杂场景配置和组装,实现新业务新需求时改动小,提高开发效率

3、支持对其他业务提供服务,解决了业务逻辑处理异地处理

相关文章
|
12天前
|
缓存 监控 Java
Java 线程池在高并发场景下有哪些优势和潜在问题?
Java 线程池在高并发场景下有哪些优势和潜在问题?
|
17天前
|
NoSQL Java Redis
京东双十一高并发场景下的分布式锁性能优化
【10月更文挑战第20天】在电商领域,尤其是像京东双十一这样的大促活动,系统需要处理极高的并发请求。这些请求往往涉及库存的查询和更新,如果处理不当,很容易出现库存超卖、数据不一致等问题。
39 1
|
30天前
|
存储 缓存 NoSQL
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
53 4
|
1月前
|
Java Linux
【网络】高并发场景处理:线程池和IO多路复用
【网络】高并发场景处理:线程池和IO多路复用
39 2
|
3月前
|
NoSQL 关系型数据库 MySQL
排行榜系统设计:高并发场景下的最佳实践
本文由技术分享者小米带来,详细介绍了如何设计一个高效、稳定且易扩展的排行榜系统。内容涵盖项目背景、技术选型、数据结构设计、基本操作实现、分页显示、持久化与数据恢复,以及高并发下的性能优化策略。通过Redis与MySQL的结合,确保了排行榜的实时性和可靠性。适合对排行榜设计感兴趣的技术人员参考学习。
187 7
排行榜系统设计:高并发场景下的最佳实践
|
26天前
|
Java Linux 应用服务中间件
【编程进阶知识】高并发场景下Bio与Nio的比较及原理示意图
本文介绍了在Linux系统上使用Tomcat部署Java应用程序时,BIO(阻塞I/O)和NIO(非阻塞I/O)在网络编程中的实现和性能差异。BIO采用传统的线程模型,每个连接请求都会创建一个新线程进行处理,导致在高并发场景下存在严重的性能瓶颈,如阻塞等待和线程创建开销大等问题。而NIO则通过事件驱动机制,利用事件注册、事件轮询器和事件通知,实现了更高效的连接管理和数据传输,避免了阻塞和多级数据复制,显著提升了系统的并发处理能力。
40 0
|
2月前
|
缓存 分布式计算 Hadoop
HBase在高并发场景下的性能分析
HBase在高并发场景下的性能受到多方面因素的影响,包括数据模型设计、集群配置、读写策略及性能调优等。合理的设计和配置可以显著提高HBase在高并发环境下的性能。不过,需要注意的是,由于项目和业务需求的不同,性能优化并没有一劳永逸的解决方案,需要根据实际情况进行针对性的调整和优化。
87 8
|
29天前
|
消息中间件 前端开发 Java
java高并发场景RabbitMQ的使用
java高并发场景RabbitMQ的使用
72 0
|
3月前
|
存储 缓存 监控
函数计算产品使用问题之调用sd生图时,怎么保证高并发场景正常运行
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
3月前
|
弹性计算 监控 Serverless
函数计算产品使用问题之如何处理银行转账场景遇到的高并发问题
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。