项目简介
项目主要是针对品牌广告迁移至竞价广告平台,在竞价平台实现品牌广告下单,取代以前品牌广告复杂的交互,降低品牌广告主的准入门槛。
涉及系统
- 上游(S):广告平台前端(S1),以及广告平台后端(S2)
- 订单中心(C)
- 下游(X): 库存平台(X1),类似于商品库; 结算平台(X2),类似于生成发票; 计费平台(X3),实时扣除账户余额
- 落库记录:库存平台记录(R1),结算平台记录(R2),订单中心记录(R3),广告平台记录(R4),计费平台记录(R5)
流程:
- 在广告前端页面(S1)发起一次创建,经过广告平台后的(S2)处理请求
- 在广告平台后端访问订单中心(C),订单中心调用库存平台(X1),占用投放库存,生成库存投放记录(R1)
- 订单中心调用结算平台(X2),完成结算单的创建(R2)
- 订单中心生成订单中心记录(R3),将下单结果返回给广告平台后端(S2),实现广告记录创建(R4)
- 在开始投放前5分钟,由订单系统异步调用计费平台(X3),发起计费余额锁定,生成计费记录(R5),完成下单全流程
- 广告会经过一些列处理,进入投放过程并实现实时扣费。
项目开发
前期准备
字段极值:精确对到每个字段的取值含义差距,比如某选项全选值,不选默认值,int16或者64
字段选填:字段可选or必填,如果必填,确认上游可以获取到值,以及对应值取值逻辑,含义是否一致
字段单位:
时间相关:确认时区(广告主时区或者投放地时区),时区单位(utc,gmt),data string格式(yymmdd或者其他),时间戳取值(s,ms,或者其他);
货币相关:确认币种单位(美元或者其他),货币取值(广告主货币或者投放国家货币),放大或者不放大(有的国家小数点位数比较多,为了方便单次计费,可能会乘上一个固定值后存储,比如十万)
接口文档:先提供给下游原有流程字段取值差异,在由下游给出接口文档,结合需求文档,确定字段取值是否严格一致,不一致,需要进行链路沟通(直接上下游和间接上下游),得出最终结论。
完成各方技术文档评审,产出项目相关研发同学排期,确定连调,提测时间,然后再去对齐测试同学排期,协调后给出测试时间,checklist时间,最后确认上线时间,告知到pm以及相关业务方
具体开发
对齐公司主流项目架构,如果有特殊处理逻辑,考虑在项目结构命名中体现,比如用到了全局拦截,或者用到了某些设计模式
(了解组件优劣,接入成本等综合考虑)
消息中间件:
缓存:
db:
动态配置:
项目维护
一些细节
订单中心先写对帐表,在创建订单,(延迟消息+错峰定时扫描表)准实时对帐,push上下游提供按id查询状态信息,幂等取消接口
对帐表唯一键限制,加redis分布式锁,保证一个订单只能执行一次,且不会存在同时执行的情况
订单为整点执行,采用双延时涉及,大周期扫描表先执行,扫描到的记录发送延迟消息到延迟任务,触发订单,小周期执行,扫描到未执行记录立刻执行,由于扫描表,可以将开始执行时间设置为索引,提高扫描效率
- 超卖
天然低并发,以时区和版位粒度进行库存锁定
- 主动推送:邮件推送提前将准失败的订单告知广告主,以及群推送,将关闭订单进行群推送,附加traceid,异常结束订单附加具体原因。
- 定时推送:推送每天订单增量情况
- 主动关闭:存在不一致情况的订单,比如上游木有记录,可直接进行关闭,避免人工干预
- 打点:关键节点进行业务打点告警,系统通用打点接入(机器状态,垃圾回收试验,上下游时延)
- 自动开白工具搭建
- 异步具体的执行,只留最关键的校验和计费
- 一些和流程无关的步骤,比如日志存储,局部回显数据存储(只会影响部分观看),放在协程处理
- 异步调用接口改为同步后,给下游提出最长试验要求,push下游改动
- 提示性校验前置,提高广告主的订单成功率
- 推送相关辅助功能放单独项目进行触发管理,防止和主项目过多耦合
- 批量rpc接口发出时用不同的context,防止下游根据logid日志太多,不利于异常定位
持续跟进
流程优化:
接口性能:
主要是耗时,对齐下游超时原因,并协助优化。
库存侧(10->3s,提高333%)取消密集打点,将大文件进行更小粒度拆分;
合同侧(2s->200ms,提高1000%),梳理必要字段,减少不必要关联表查询,push上游提供专用接口;
结算平台侧(2s->300ms,提高666%),次要信息缓存,次要流程异步化处理
线上case总结:
订单不一致:主要因为超时导致某方无数据或者修改失败,后续考虑各方进行幂等接口处理,使接口可重复访问
接口超时:
业务流程:上下游bug,前端交互bug,间接依赖方相关处理流程未接入(豁免)
广告主自身case:创意未就绪,余额未及时充值,资金池不合规
机器时钟抖动:留出几秒buffer时间
团队建设
- 整理需求文档,名称,需求prd文档,排期链接,必要备注,各阶段deadline
- 维护迭代文档,需求文档,技术方案文档,checklist文档合集,方便后续同学学习
- 整理项目相关系统交互,服务仓库地址
- 整理上下游依赖,接口文档,项目名称,常用群组以及联系人
- 复杂前后端逻辑整理设计文档
- 错误周复盘
- 搭建知识空间
- 完善oncall机制(发版,流水线,值班,case文档建设,周期性文档沉淀)
- 先操作一个RF广告(增删改查),观察核心接口调用,熟悉常见字段定义和数据流转
- 做一个小需求,熟悉常见项目,已经研发流程规范
- 独立own一个需求
- 完成新人串讲
- 组内cr,设计cr
一些小总结
多push,多沟通,严格执行deadline,快速响应问题为基本原则,自动化方案为最终实现