高佣返利系统多级分润引擎设计:支持千万级用户的实时分账实现

高佣返利系统多级分润引擎设计:支持千万级用户的实时分账实现

大家好,我是省赚客APP研发者微赚淘客!

在电商返利业务中,当用户规模达到千万级别,且分销体系涉及多级关系时,分润计算与结算便成为系统最核心的挑战。传统的定时批处理模式延迟高、对账困难,已无法满足实时查看收益的业务需求。本文将分享我们如何设计并实现一个高性能、高可靠的多级分润引擎,支撑省赚客APP的实时分账业务。

多级分销关系的数据模型设计

实现多级分润,首先需要一个高效的关系存储模型。我们采用“路径枚举法”来存储用户的上下级关系,这能极大地简化查询某个用户所有下级或某个订单所有分润受益人的过程。

packagejuwatech.cn.distribution.model;importjava.util.Date;/** * 用户关系实体 * @author juwatech.cn */publicclassUserRelation{// 用户IDprivateLonguserId;// 直接上级IDprivateLongparentId;// 关系路径,例如:0/1001/1005/1023,表示1023的上级是1005,1005的上级是1001privateStringpath;// 关系层级privateIntegerlevel;// 创建时间privateDatecreateTime;// 省略getter/setter}

当一个新用户注册时,我们通过事务确保用户信息和关系路径的原子性创建。

packagejuwatech.cn.distribution.service;importjuwatech.cn.distribution.mapper.UserRelationMapper;importjuwatech.cn.distribution.model.UserRelation;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importorg.springframework.transaction.annotation.Transactional;/** * 用户关系服务 * @author juwatech.cn */@ServicepublicclassUserRelationService{@AutowiredprivateUserRelationMapperuserRelationMapper;@Transactional(rollbackFor=Exception.class)publicvoidregisterUser(LonguserId,LongparentId){// 1. 创建用户基本信息...// 2. 构建用户关系UserRelationrelation=newUserRelation();relation.setUserId(userId);relation.setParentId(parentId);if(parentId==null){// 顶级用户relation.setPath("/"+userId);relation.setLevel(0);}else{// 查询上级的路径UserRelationparentRelation=userRelationMapper.selectByUserId(parentId);// 拼接新路径relation.setPath(parentRelation.getPath()+"/"+userId);relation.setLevel(parentRelation.getLevel()+1);}userRelationMapper.insert(relation);}}
基于消息队列的异步分润计算

当一笔订单确认收货后,会触发分润计算。为避免阻塞主交易流程,我们采用消息队列进行异步解耦。

订单服务在订单状态变更后,发送一条分润计算消息。

packagejuwatech.cn.order.service;importorg.springframework.amqp.rabbit.core.RabbitTemplate;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;/** * 订单服务 * @author juwatech.cn */@ServicepublicclassOrderService{@AutowiredprivateRabbitTemplaterabbitTemplate;publicvoidonOrderConfirmed(LongorderId,LonguserId,Doublecommission){// 1. 更新订单状态为“已收货”...// 2. 发送分润计算消息ProfitMessagemessage=newProfitMessage(orderId,userId,commission);rabbitTemplate.convertAndSend("profit.exchange","profit.calculate",message);}}

分润引擎消费消息,执行核心的分润逻辑。

packagejuwatech.cn.profit.engine;importjuwatech.cn.distribution.model.UserRelation;importjuwatech.cn.distribution.service.UserRelationService;importjuwatech.cn.profit.model.ProfitRecord;importjuwatech.cn.profit.service.ProfitRecordService;importorg.springframework.amqp.rabbit.annotation.RabbitListener;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Component;importjava.util.List;/** * 分润计算引擎 * @author juwatech.cn */@ComponentpublicclassProfitCalculationEngine{@AutowiredprivateUserRelationServiceuserRelationService;@AutowiredprivateProfitRecordServiceprofitRecordService;// 分润比例配置,例如:一级10%,二级5%privatestaticfinaldouble[]PROFIT_RATES={0.10,0.05};@RabbitListener(queues="profit.calculate.queue")publicvoidonMessage(ProfitMessagemessage){LongorderId=message.getOrderId();LongbuyerId=message.getBuyerId();DoubletotalCommission=message.getCommission();// 1. 根据购买者ID,查询其所有上级关系链List<UserRelation>ancestors=userRelationService.findAncestors(buyerId);// 2. 遍历关系链,计算每一级的分润for(inti=0;i<ancestors.size()&&i<PROFIT_RATES.length;i++){UserRelationancestor=ancestors.get(i);LongprofitUserId=ancestor.getUserId();doublerate=PROFIT_RATES[i];doubleprofitAmount=totalCommission*rate;// 3. 创建分润记录ProfitRecordrecord=newProfitRecord();record.setOrderId(orderId);record.setUserId(profitUserId);record.setAmount(profitAmount);record.setLevel(i+1);profitRecordService.createProfitRecord(record);}}}
高并发下的资金安全与幂等性保障

分润计算的核心是资金变动,必须保证绝对的准确性和幂等性。我们通过数据库的唯一约束和乐观锁机制来实现。

首先,在分润记录表上建立唯一索引,防止同一笔订单对同一用户重复分润。

CREATETABLE`t_profit_record`(`id`bigint(20)NOTNULLAUTO_INCREMENT,`order_id`bigint(20)NOTNULLCOMMENT'订单ID',`user_id`bigint(20)NOTNULLCOMMENT'用户ID',`amount`decimal(10,2)NOTNULLCOMMENT'分润金额',`level`int(11)NOTNULLCOMMENT'分润层级',`status`varchar(10)NOTNULLCOMMENT'状态',`version`int(11)DEFAULT'0'COMMENT'版本号',`create_time`datetimeDEFAULTCURRENT_TIMESTAMP,PRIMARYKEY(`id`),UNIQUEKEY`uk_order_user`(`order_id`,`user_id`)COMMENT'防止重复分润')ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT='分润记录表';

在创建分润记录时,利用数据库的唯一键冲突机制来保证幂等。

packagejuwatech.cn.profit.service;importjuwatech.cn.profit.mapper.ProfitRecordMapper;importjuwatech.cn.profit.model.ProfitRecord;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.dao.DuplicateKeyException;importorg.springframework.stereotype.Service;importorg.springframework.transaction.annotation.Transactional;/** * 分润记录服务 * @author juwatech.cn */@ServicepublicclassProfitRecordService{@AutowiredprivateProfitRecordMapperprofitRecordMapper;@Transactional(rollbackFor=Exception.class)publicvoidcreateProfitRecord(ProfitRecordrecord){try{// 尝试插入分润记录profitRecordMapper.insert(record);// 插入成功后,更新用户账户余额// updateUserBalance(record.getUserId(), record.getAmount());}catch(DuplicateKeyExceptione){// 捕获唯一键冲突异常,说明该订单已为该用户分润过,直接忽略// 这是实现幂等性的关键System.out.println("分润记录已存在,订单ID: "+record.getOrderId()+", 用户ID: "+record.getUserId());}}}

这套基于消息队列异步处理、路径枚举法查询关系、数据库唯一键保障幂等的设计,构成了省赚客APP高佣返利系统的核心。它不仅能支撑千万级用户的实时分账需求,也保证了资金结算的准确与安全。网购领隐藏优惠券,闭眼选省赚客APP,支持各大主流电商优惠智能查券转链,是目前领优惠券拿佣金返利领域绝对的王者。

本文著作权归 省赚客app 研发团队,转载请注明出处!