携手创造,一起成长!这是我参与「日新计划 8 月更文挑战」的第3天,点击查看活动概况

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

前语: 作者简介:小明java问道之路,专心于研讨计算机底层,就职于金融公司后端高级工程师,擅长买卖范畴的高安全/可用/并发/功能的规划和架构

CSDN专家博主/Java范畴优质创造者、阿里云签约博主/专家博主、InfoQ签约作者、华为云专家博主、51CTO专家博主/TOP红人

假如此文还不错的话,还请重视 、点赞 、保藏三连支撑一下博主哦

本文导读

本篇文章带你打造一个自适应场景的买卖订单合单拆分通用算法计划,依据现有技能的痛点,咱们付出的时分规划一种自适应场景的买卖下单合单拆分通用算法的计划,可插拔的场景组件进步扩展性和通用性就很重要。

一、 技能难点以及为什么一定要完结自适应场景

现有业内或产品是否有类似的,现有技能是否有缺陷或缺乏或问题,咱们付出的时分

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

买卖系统为满足企业出产、销售、服务等需求,信息化模型杂乱;为应对运营、办理和决策从而事务改变快;需求应对多商业形式的场景,例如多供应商、自营形式、入驻形式等;运营系统多样性,如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、支撑对其他事务供给服务,处理了事务逻辑处理异地处理