用户看个广告,积分怎么分给上10代?裂变关系链的架构设计

📅 2026/7/23 21:01:10
用户看个广告,积分怎么分给上10代?裂变关系链的架构设计
一、两种裂变模式的技术本质裂变营销系统的核心技术挑战不在业务规则本身而在于关系链的数据结构设计和积分流转的路由算法。本文拆解两种典型裂变模式的技术实现模式A三三复制广告积分用户看广告产生积分积分按第N个广告→第N代上级的规则路由到关系链上。每个节点最多直推3人超出部分自动滑落到下级网络。全程只有积分流转不涉及资金交易。模式B推三返一用户消费后解锁推广资格成功推荐3位新用户消费后全额返还首单费用。仅一级直推返利无层级计酬。两种模式的技术差异在于模式A需要维护一棵深度可达10层的三叉树并实现代际积分路由模式B只需要一级关系链和返利状态机。本文重点拆解模式A的技术架构模式B作为对比参照。二、三三复制的关系树数据结构2.1 三叉树的存储模型三三复制的核心约束是每个节点最多有3个直接子节点。这棵树的存储有两种方案方案一邻接表模型每个节点记录parent_id和三个子节点指针node_id主键parent_id父节点IDchild_1_id, child_2_id, child_3_id三个子节点可为空depth节点深度根节点为0tree_position在父节点中的位置1/2/3created_at创建时间用于滑落排序方案二路径枚举模型每个节点记录从根到自身的完整路径node_id主键path如1.2.3.1表示根节点的第2个子节点的第3个子节点的第1个子节点depth路径深度等于path中.“的数量两种方案的权衡邻接表模型写入快只需更新父节点的child指针但查询某节点的第N代祖先需要N次查询逐级查parent_id路径枚举模型查询快直接从path中截取前N段即可定位第N代祖先但写入时需要维护path字符串树结构调整如节点迁移代价高系统采用混合方案邻接表为主存储写入性能好同时在Redis中维护每个节点的祖先链缓存ancestors_list用于高频的代际路由查询。祖先链在节点创建时一次性计算并缓存后续读取只需O(1)时间。2.2 自动滑落算法当用户A已直推3人第4个被推荐人B加入时系统需要自动将B放置到A的子树中子节点未满的位置”。滑落规则是从上到下、从左到右。算法流程从A节点开始检查A的三个子节点位置child_1/child_2/child_3找到首个空位。如果有空位B直接填入。如果A的三个子节点都已满进入A的子树做广度优先遍历BFS。BFS按层级遍历先检查A的所有直接子节点第1层再检查第2层依此类推。在同一层中从左到右child_1→child_2→child_3检查每个节点是否有空位。找到的首个空位即为B的放置位置。算法复杂度最坏情况下需要遍历到第k层才找到空位遍历节点数为3132…3^k。对于10层三叉树总节点数上限约88573个但实际滑落时通常在前几层就能找到空位因为树的不均衡性平均遍历不超过20-30个节点。2.3 滑落的并发控制高并发场景下多个用户同时推广可能导致滑落竞争——两个人同时推荐到同一个空位。系统采用分布式锁乐观重试的方案滑落算法执行前对目标子树的根节点加分布式锁Redis RedLock锁持有期间完成空位查找和节点写入如果获取锁失败等待200ms后重试指数退避最多重试3次写入完成后释放锁下一个滑落请求可以继续锁的粒度选择子树根节点而非全局锁确保不同子树的滑落可以并行执行吞吐量不受单点限制。2.4 深度限制与截断策略三三复制树的深度直接影响积分路由的范围。模式A设定深度上限为10层——第10个广告的积分路由给第10代上级。超过10层的节点不再参与积分路由。深度限制的实现方式数据库CHECK约束depth ≤ 10应用层校验滑落算法在BFS遍历时设置最大深度参数超过10层不再向下搜索空位如果某子树10层已满新节点滑落到该子树的其他分支或标记为溢出节点不参与积分路由但保留关系链记录三、广告积分的代际路由引擎3.1 广告索引到代际的映射规则模式A的核心规则用户观看第N个广告时产生的积分路由给其第N代上级。映射关系第1个广告 → 第1代上级直推人parent_id第2个广告 → 第2代上级parent的parent…第10个广告 → 第10代上级用户自身的广告计数器独立维护每个用户有一个ad_counter字段记录已观看的广告序号。每次观看广告时ad_counter1当前值即为N决定积分路由给第N代上级。3.2 积分路由的执行流程当用户U观看第N个广告时积分路由引擎执行以下步骤读取U的ad_counter自增得到N从Redis缓存中读取U的ancestors_list祖先链取ancestors_list的第N个元素即第N代上级的node_id如果第N代上级存在深度足够生成一条积分流水sourceU, targetancestor_N, amount1, typeAD_REWARD如果第N代上级不存在U的深度不足N层即U在树中的深度N积分进入无归属状态可配置为销毁或回流到平台池3.3 反向积分汇聚上面描述的是用户看广告给上级送积分。反过来下级看广告时积分也会回流到上级。从上级A的视角看其第K代下级的广告行为会产生积分给A。但A的第K代下级可能有很多个三三复制下第K代有3^K个节点。A收到的积分数量取决于其第K代下级中有多少人观看了第K个广告。系统不需要主动推送积分给A——积分路由是看广告时触发的。每个下级观看第K个广告时系统检查其第K代祖先是否为A如果是则积分路由到A。这是一种拉模式pull-based的积分分发由广告观看事件驱动不需要遍历A的全部下级。3.4 积分计数的幂等性广告观看可能因为网络重试导致重复回调。系统需要确保同一个广告观看事件不会产生多条积分流水每次广告观看生成唯一的event_id广告ID用户ID时间戳的哈希积分流水表对event_id做唯一索引重复回调时INSERT操作因唯一索引冲突而失败系统捕获异常并忽略ad_counter的自增使用数据库的原子操作UPDATE … SET counter counter 1 WHERE …避免并发导致计数跳跃四、推三返一的返利状态机4.1 与模式A的架构差异推三返一模式的技术复杂度远低于三三复制不需要维护多叉树只需要一级parent_id关系不需要代际路由返利只在直推关系中发生不需要滑落算法推荐人就是直接上级核心数据模型user_id, parent_id直推人, purchase_status是否已消费, referral_count成功推荐人数, refund_status返利状态4.2 返利状态机设计用户从消费到返本的状态流转S0 未消费用户注册但未购买无推广资格S1 已消费待推广用户完成购买解锁推广资格referral_count0S2 推广进行中每成功推荐1人消费referral_count1referral_count1时触发阶段返利如返还10%referral_count2时触发阶段返利如返还20%referral_count3时触发全额返本剩余70%进入S3S3 返本完成首单费用已全额返还可配置为继续推广赚纯收益状态机的关键约束只有处于S1或S2状态的用户才能成为推荐人被推荐人必须完成购买进入S1才算成功推荐仅注册不算referral_count只统计首次消费的被推荐人重复消费不累计4.3 返利金额的幂等控制阶段返利推第1人返10%、第2人返20%、第3人返70%需要确保每阶段只触发一次返利触发基于referral_count的变化而非事件回调系统在referral_count从0→1时触发首阶段返利1→2时触发第二阶段2→3时触发第三阶段使用数据库行锁SELECT … FOR UPDATE锁定用户记录确保并发推荐不会导致计数错误每次返利生成独立的返利流水记录包含触发时的referral_count值用于审计五、积分账本系统设计5.1 双分录记账模型模式A的积分流转采用双分录记账法Double-Entry Bookkeeping确保积分守恒每笔积分变动产生两条记录贷记Credit积分来源方广告观看事件产生的积分sourceAD_SYSTEM借记Debit积分接收方上级用户账户积分账本表结构entry_id主键transaction_id交易批次ID同一次积分路由的两条记录共享account_type来源账户/目标账户account_id广告系统/用户IDdirectionCREDIT/DEBITamount积分数量event_id关联的广告观看事件IDcreated_at时间戳双分录确保任意时点的积分总量守恒所有CREDIT之和 所有DEBIT之和。如果出现不一致说明系统存在bug或数据损坏。5.2 积分到购物券的兑换积分不能直接提现只能兑换购物券。兑换流程用户发起兑换请求指定兑换数量系统检查用户积分余额是否充足生成兑换流水从积分账户DEBIT到购物券账户CREDIT购物券设置有效期如30天过期自动作废购物券在合作商户消费时抵扣商户按抵扣金额与平台结算兑换汇率固定如1积分1购物券0.187元汇率基于广告收入拨出比例计算单次广告收入CPM/1000如220元/1000次0.22元/次平台拨出比例85%单次广告产生的积分价值0.22 × 85% 0.187元5.3 无资金池的架构保障模式A的合规核心是全程不碰资金。系统架构层面的保障措施系统无充值接口系统不提供任何资金充值入口用户账户中只有积分余额没有现金余额系统无提现接口积分只能兑换购物券不能提现为现金购物券结算走商户通道购物券在商户消费时资金从广告主→平台→商户不经过用户账户积分非货币属性积分在系统中定义为任务奖励单位不是电子货币不能跨用户转账这些架构约束从代码层面杜绝了资金池的形成——系统根本不存在处理资金的模块。六、合规边界检测系统6.1 层级深度锁模式A的积分路由深度为10层但模式B的返利深度为1层。不同模式的层级深度限制不同系统需要根据模式配置做硬约束。实现方式数据库层CHECK约束 depth ≤ max_depth模式A: 10, 模式B: 1应用层积分路由引擎在取第N代祖先时检查N ≤ max_depth监控告警如果出现depth超过max_depth的记录立即告警并阻断6.2 计酬函数合规检测传销的法律界定中“以发展人员数量为依据计算报酬是核心特征。系统需要证明计酬函数不依赖人头数。模式A的计酬函数f(ad_views) ad_views × points_per_view × exchange_rate变量是广告观看次数劳动行为不是推荐人数推荐人数只影响关系链结构积分路由路径不直接参与计酬计算模式B的计酬函数f(referral_count) refund_amount IF referral_count ≥ 3变量是成功推荐消费的人数但返利上限为首单费用非盈利性返利且仅一级系统内置计酬函数审计模块定期检查积分/返利的计算逻辑是否符合上述函数定义如果发现异常计算逻辑如出现与人头数挂钩的乘数因子触发合规预警。6.3 关系链可视化审计系统提供关系链可视化工具支持查看任意用户的关系树最多展示10层标注每个节点的积分来源和去向检测异常结构如某条链路深度异常、某节点子节点数量超限导出关系链数据供合规审查七、系统整体架构7.1 架构分层系统分为六层用户接入层小程序/H5前端广告展示、积分查看、推广分享关系链管理层三叉树存储、滑落算法、祖先链缓存、深度控制广告任务引擎广告调度、观看计数、事件生成积分路由引擎代际路由、幂等控制、双分录记账账本结算层积分账户管理、购物券兑换、商户结算合规监控层层级深度锁、计酬函数检测、关系链审计7.2 技术选型关系树存储PostgreSQL支持递归CTE查询适合树结构遍历祖先链缓存Redis Sorted Set按深度排序的祖先列表消息队列Kafka广告观看事件广播积分路由异步消费分布式锁Redis RedLock滑落并发控制账本数据库MySQL事务支持确保双分录一致性7.3 性能考量积分路由是高频操作1万活跃用户 × 10条广告/天 10万次/天的积分路由单次路由延迟目标50msRedis缓存命中时滑落算法低频但耗时平均遍历20-30个节点延迟10ms账本写入批量异步写入每秒可处理1000条流水八、常见技术问题Q1三三复制的树如果某条链路特别深10层全满而其他链路还很浅滑落会怎么处理滑落算法的BFS遍历天然解决了这个问题——它总是找最浅的空位。如果某条链路10层全满BFS会跳过该链路在其他更浅的链路中寻找空位。如果整棵树所有链路都达到10层深度理论上限约88573个节点新节点将无法放置系统标记为溢出”需要人工介入或开启新树。Q2用户看广告的顺序重要吗如果他先看了第5个广告再看第1个广告积分怎么路由积分路由基于ad_counter的当前值不基于广告内容。用户每次观看广告不管哪个广告ad_counter都1。第1次观看→第1代第2次观看→第2代依此类推。广告内容与积分路由无关广告系统只负责展示广告积分路由引擎只关心这是第几次观看。Q3如果一个用户的上级第3代在项目中途退出了注销账号他的积分怎么处理系统对注销用户的关系链节点做软删除——保留节点结构和深度信息但标记为inactive。积分路由时如果目标祖先是inactive状态积分进入无归属池。可配置处理策略销毁、回流平台池、或顺延给下一级活跃祖先。推荐策略是顺延——将积分路由给第N1代祖先确保积分不浪费。Q4推三返一模式中被推荐人在3人未满之前退款了推荐人的referral_count怎么处理被推荐人退款后其purchase_status回退为未消费状态推荐人的referral_count需要相应减1。如果推荐人已经基于该推荐人触发了阶段返利如推第1人时已返还10%需要生成冲销流水从推荐人后续返利中扣减。系统通过退款事件触发反向冲销流程确保返利金额准确。Q5广告积分的兑换汇率是固定的还是可调的如果CPM变化了怎么办兑换汇率基于CPM和拨出比例计算两者都是可配置参数。系统支持汇率版本管理每次参数变更生成新版本新版本仅对变更后的积分生效历史积分按变更时的汇率兑换。汇率变更需记录操作日志变更人、变更时间、旧值、新值、变更原因支持审计追溯。Q6系统如何防止用户刷广告自动播放、脚本模拟观看广告观看事件的生成需要满足以下条件才算有效广告播放时长达到完整时长的80%以上、播放期间有随机交互验证如每15秒弹出的微交互按钮、设备指纹和IP频率限制同一设备/IP每小时观看上限。无效观看不触发积分路由。同时系统通过观看行为模式分析检测异常——正常用户的观看间隔有随机性脚本观看通常间隔固定行为特征检测可识别大部分自动化行为。九、核心要点总结裂变关系链系统的架构设计核心解决三个技术问题关系链结构可维护通过三叉树邻接表祖先链缓存的混合存储方案支持高效的滑落放置和代际查询通过分布式锁解决并发滑落竞争通过深度限制约束积分路由范围积分路由可追溯通过广告计数器到代际索引的映射规则实现第N个广告→第N代上级的精准路由通过双分录记账确保积分守恒通过幂等控制防止重复计算合规边界可检测通过层级深度锁限制返利层级通过计酬函数审计证明收益来源于劳动行为而非人头费通过无充值/无提现的架构约束杜绝资金池形成两种模式的技术复杂度差异显著模式A需要维护多叉树、实现代际路由和滑落算法系统复杂度高但可扩展性强模式B只需一级关系链和状态机实现简单但扩展性有限。选择哪种模式取决于业务场景对裂变深度和合规边界的不同要求。从技术架构角度看裂变系统的本质是关系链数据结构与价值流转引擎的组合。关系链决定了价值的流转路径谁给谁流转引擎决定了价值的计算规则给多少。两者解耦设计——关系链模块只负责拓扑维护不参与价值计算流转引擎只负责价值计算不感知关系链拓扑——使系统可以灵活适配不同的裂变规则而不需要修改底层存储结构。