模型演进:维度建模-> 宽表模型 -> dw模型 -> 子域模型
数据模型
- 子域模型:借鉴领域建模,面向领域对象,将稳定的子域业务逻辑进行沉淀,每一个子域都是dwd,再将所有的子域dwd合成数据中台dwd,最后再分流到各业务线,进行业务逻辑的开发。
- 事实表:事务事实表、周期快照事实表、累计快照事实表
- 实时数据中台:抽取业务系统中的公共部分成为服务,具备了对于前台业务变化及创新的快速响应能力。
- 中台既要全链路统一拉横,又要做薄
- 中台覆盖率80%,提效降本,快速支撑业务
- 子域要稳定,不包含业务逻辑,且能支撑总台覆盖不了的需求
技术架构
- 离线和实时独立链路
- 离线和实时完全两条独立的链路,互不相关,维护两套逻辑,对数成本高
- 批流一体1.0 事务表离线和实时链路 (case:交易订单)
- 借用Hologress统一存储,可以把离线数据加速到Hologress,在接口层统一。
- 离线和实时逻辑独立计算,实时计算增量,离线计算历史全量,但不适用于累计快照表。
- 批流一体2.0 累计快照表离线和实时链路 (case:物流订单)
- 累计快照表(物流订单)更新周期长,state存储压力大,用增全量合并思想进行状态更新。
- 实时计算增量,离线计算历史全量,但实时更新状态依赖离线全量,不用重算。
模型优化
-
消息保序 --last_value
--字段级别去重
create view tmp_v1 as
select id
,last_value(type,name) as name --关闭回撤 + -
-- ,first_value(type,name)as name
from order_souce
group by id
--行级别去重
create view tmp_v1 as
select *
from
(
select *
,row_number() over(partition by id order by gmt_modified desc) as rn
--,row_number() over(partition by id order by proc() desc) as rn
from order_souce
)
where rn=1
-
批流混合 --udaf
create view order_source as
select id
,last_v(type,name) as name --关闭回撤 + -
-- ,first_v(type,name)as name
(
select id,name,'ri' as type
from ri
union all
select id,name,'df' as type
from df
)
group by id
纯实时流的DAG:
批流混合的DAG:
-
双流join
--双流join
select a.id
,a.name
,b.age
from a
left join b
on a.id= b.id
--双流join优化
select id
,last_value(if(type='t1',name,null)) as name --last_v关闭回撤 + -
,last_value(if(type='t2',age,null)) as age
from
(
select 't1' as type
,id
,name
,'-' as age
from a
union all
select 't2' as type
,id
,'-' as name
,age
from b
on a.id = b.id
)
group by id
uinon all的DAG:
-
外键乱序
- 为什么会产生乱序
解决方案:
1.全链路保序
2.外键关联前置
保障方案
- 主备链保障
- 全链路压测
全链路三档(5倍、10倍、15倍)灌数,压测input rps和output rps峰值
- 报警监控
- input rps<=0 监控
- 延迟>3min 监控
- 10分钟内checkpoint 成功次数增长波动<1
- failover次数>0 监控