京东广告计费架构演进之路
如果无法正常显示,请先停止浏览器的去广告插件。
1.
2. 京东广告计费系统的架构演进
3. 哲学三问
我是谁?
刘军。对数据库内核开发、分布式系统及分布式计算有浓烈兴趣
的人。
我从哪里来?
2016年加入京东商业提升事业部-广告数据部。现为京东-数据算
法通道的一名高级工程师。负责并搭建过广告日志系统、广告计
费系统、离线数据处理等。
我要到哪里去……
4. 京东广告计费系统的架构演进
01 背景介绍
02 三个阶段
03 未来重心
5. 一、背景介绍
系统本质
1. IO密集计算任务
2. 事件驱动型
3. 按C、M和A计费
系统要求
1. 数据一致性要求高
2. 吞吐量高
3. 低延迟
数据链路
1. 日志系统中间一环
2. 数据仓库的建设
广告系统
1. 下游广告物料的召回
2. 播放、报表的时效性
6. 京东广告业务特点
起步较早 站内广告玩法丰富
几乎伴随着国内的大数据浪潮 预算多种多样,多种级别的预
而兴起
算控制。计划和活动等层级的
预算玩法。
站外媒体模式多 账户体系复杂
1. 直投模式 1. 各种模式下的子账户结构
2. 头条及快手业务模式复杂 2. 各个层级下的专款专用
3. GD/PD等模式对接 3. 营销模式多元导致的多种资
4. 腾讯广告的深度结合
金类型
7. 如何衡量广告计费系统?
指标
稳定篇
性能篇
单位
受何影响
应用级一致性保障 强/弱/最终 网络/宕机/系统设计等
系统可用性 百分比 系统上下线/宕机等
系统平均吞吐 事件数每秒 系统设计
系统峰值吞吐 事件数每秒 同上
事件平均延时 毫秒 同上
事件延时TP99 毫秒 同上
单账户最高吞吐 事件数每秒 单账户IO
账户操作响应时长 TP99等 同上
8. 二、京东广告系统演进的三个阶段
青铜时代
从零到一
2014年-2017年
白银时代
性能跃升
2017年-2020年
黄金时代
走向一致
2020年-至今
9. 青铜时代
10. 数据链路
Stream System
Stream System
B1
A1
A2
CPC Billing
B1
C
C
A1
CPM Billing
Realtime
Report
B2
D
Finance
Server Cost
Budget Dedupe
E
MySQL
A1 Post-anti click
A2 Post-anti refund click
B1 Post-anti impression
C IO interaction
D Billed click block
E Billed impression block
A2
Redis
Data Warehouse
Report Engine
Data Mining
HBase
11. 小结
2
1
快速搭建并交付了一
套系统
基本满足业务需求
3
财务与统计完全分离。
独立的事件计费处理,
不容易互相影响
12. 白银时代
13. 直面问题
问题 Problems
• 性能出现瓶颈
方案 Solution
•
性能提升
• 任务不稳定,经常延时 • 反范式的设计
• 数据质量较差 • 基于乐观锁的计费
• 问题摸排效率低
• 流式的设计
• 财务扣费数据保障
•
•
应用一致性校验与保证
完备的全链路监控
14. 解决问题
问题 Problems
• 性能出现瓶颈
方案 Solution
•
性能提升
• 任务不稳定,经常延时 • 数据链路上任务的整合
• 数据质量较差 • 反范式的设计
• 基于乐观锁的计费
• 问题摸排效率低
• 流式的设计
• 财务扣费数据保障
•
•
应用一致性校验与保证
完备的全链路监控
15. Delivery
数据链路
Stream System
Budget Operation
Service
Budget
Service
A1
A2
B1
Billing / Finance States
Bud
Fin
C
Conf
Dedup
Bal
D
Billing
A3
Finance Operation
Service
B2
Account
Offline
Finance
Service
Campaign
Offline
Finance Settle
Service
JD Settle Platform
Batch Report
A1 Post-anti click B1 Post-anti impression
A2 Post-anti refund click B2 Billed impression
A3 Billed click D Billing failed impression
C Billing failed click
Report Engine / JST / Various Down-streams
16. 乐观式上锁的扣费
处理流程图
场景说明
Fetch From remote
Finance
Service
Start
Local Exists?
Deduct according Map
Fetch and update Local
Read to Sync?
Rewind the account
Lock Account
Account
Deduct
Billing
System
Account
Modified ?
Commit
End
17. 保证最终一致性的统计系统
Lambda架构
1.
2.
B
A
Realtime
Report
Report
Incr
Micro-
Batch
A
Post-anti click
B
Post-anti impression
Batch
Report
Meta Data
实时系统尽力写库,不保证准确性
批式系统按日调度,保证数据 最终一致
系统描述
实时系统:以实时读到的数据,追写数据至DB
批式系统:以HDFS数据为基准,重新计算并 覆写
数据至DB
两阶段提交
预写阶段:先写数据至HDFS,再追写至数据库
提交阶段:写 HDFS成功 即进入提交阶段,将
offset提交至持久化存储
18. 基于BloomFilter的日志去重
整体思想
Bucket 0
Slot0
Kafka Source
hash(id)
多worker节点 + 哈希 + bucket容量管理 + slot提交管理
2. 每个slot对应一个bloom-filter,且限制了每个slot容量的上限
3. 对桶内slot遍历探查并更新是否重复
Slot1
……
shuffle(id)
1.
bucket容量管理模块
弹性扩容管理:对slot容量探查,当发现当前slot容量已满时,申请新的slot
按每两小时划分slot
Dedup Worker
Dedup Worker
Dedup Worker
Bucket 1
Slot0
……
……
Slot Page
name:
slot管理模块 基本面分析
提交管理:每5k条日志提交一次 即不考虑弹性扩容的前提下
P:误判概率 可行性分析
N:存储数据条目
每两小时承载10亿日志
内存分析
Bucket 49
Bloom
Bloom-Filter
bitmap bitmap
过期管理:每个slot根据创建时间自动过期
位图slot大小预估
Slot0
Count Slot1
Commit-tm Slot1
? = −?
ln ?
≈ ?. ?MB
ln 2 )
单个worker约占用 660MB内存
性能分析
多次哈希计算 +批量提交(30ms)
19. 全链路监控
Apps Pipeline
Billing Logstash
ElasticCluster
Elasticsearch
Node1
Finance
Server
MQ
Logstash
…… ……
Realtime
Report Logstash
Elasticsearch
Node2
Elasticsearch
Node3
Visualize
Grafana
20. 小结
01
02
03
04
性能跃进
解决了性能上的问题,稳定度过多个大促
可用性提升
模块间职责更加清晰,也更加独立,使得各个模块更加稳定
链路延迟降低
有效降低了数据链路延迟,度过了大促的考验
链路监控
丰富的各项指标,实时全盘掌握系统状态
21. 黄金时代
22. 直面问题
问题 Problems
• 复杂的站外模式带来的技术对接
方案 Solution
•
• 链路上的数据丢失或重复问题
• 机器宕机导致的数据丢失
• 重放时导致的数据重复
流式和批式计费支持
•
•
• 核心数据的一致性保证
•
基于Flink流批一体化的API
链路Exactly Once的设计与实现
• Kafka事务支持
• 两阶段提交
持久化的KV存储
•
基于Raft协议的强一致实现
23. 解决问题
问题 Problems
• 复杂的站外模式带来的技术对接
方案 Solution
•
• 链路上的数据丢失或重复问题
• 机器宕机导致的数据丢失
• 重放时导致的数据重复
流式和批式计费支持
•
•
• 核心数据的一致性保证
•
基于Flink流批一体化的API
链路Exactly Once的设计与实现
• Kafka事务支持
• 两阶段提交
持久化的KV存储
•
基于Raft协议的强一致实现
24. 多制式计费支持
Stream
Events
Files
流批一体的处理
得益于Flink的流批一体处理接又,更高的可维护性
Bud
Fin
Billing
System
Conf
Dedup
统一的处理流程
Bal
减少部分业务代码的开发,提升业务迭代的效率
Files
Events
Stream
25. 强一致的分布式KV系统
Master
State
Machine
基于Pika的分布式KV存储
Client
Binlog
兼容Redis协议,数据结构灵活
Consensus
Module
x=1
y=2
z=3
Slave
强一致的实现
基于Raft协议的标准实现
Consensus
Module
x=1
y=2
z=3
Slave
Consensus
Module
Binlog
State
Machine
x=1
y=2
Binlog
State
Machine
z=3
26. 流量管理模块的一致性实现
Exactly Once模式 + Kafka事务提交
Checkpoint
Coordinator
Checkpoint
Coordinator
x2
y3
x3
y1 y2 y3
Checkpoint
Coordinator
Transaction
Coordinator
x1
KafkaSink
y2
x2
Transaction
Coordinator
Transaction
Coordinator
x3
x1
y1
KafkaSink
KafkaSink
27. 小结
一致性
多制式
端到端
打造了强一致的 实现了流批一体 结合Flink的两阶段
分布式系统,保 的计费系统。减 提交以及事务特性,
证异常情况下重 小业务迭代的开 部分实现了端到端
要数据的不丢失 发量 的一致性
28. 未来重心
• 彻底解决端到端的一致性
• 日志的跨机房容灾等
• 更低的数据链路延迟
• 持续的系统优化,提高整体吞吐
29. 个人感悟
1. 渐进式的架构演进
2. 每个系统都有自己独特的特性
u 如同CAP理论、蒙代尔不可能三角。不要想实现一个大而完美的系统
u 比认识应用什么最重要的更关键的是系统什么特性是可以牺牲的
3. 好的系统应该是高内聚、低耦合的
4. 对系统特性的抽象描述应谨慎,尽量避免太过泛化的抽象
u
什么都能做的系统,通常什么都做不好
30. Q & A
31.
32. 流量管理模块的一致性实现
去重部分实现
v0
1.
2.
3.
4.
X1 v0
X2
X3 v0
v0
x1
x2
X3
Remote
Dedup
State
流式处理每个事件
对于每个事件进行Fetch&Write操作
记录每个事件ID时记录当前全局版本号
当Fetch出的版本号高于当前的全局版本号