
1) 【一句话结论】:采用“流处理+实时计算+混合存储(时序+宽表)+分布式事务/最终一致性”架构,通过消息队列解耦采集,Flink实时聚合指标,InfluxDB存高频数据,ClickHouse存聚合结果,StarRocks查询,结合检查点、资源动态调整保证实时性和一致性。
2) 【原理/概念讲解】:
数据采集:业务系统(订单、库存、支付等)通过消息队列(如Kafka)发布事件,解耦数据源与平台,支持不同系统(如订单JSON、库存XML)通过转换层(如Kafka Connect)统一格式,保证高吞吐。
处理:流计算引擎(Flink)处理实时聚合,比如GMV是订单金额的10秒滑动窗口聚合,库存周转通过库存(入库/出库)和出库数据计算(公式:库存周转天数=(平均库存*30)/总出库量)。Flink配置检查点(如每秒保存状态),确保故障恢复时状态一致;资源动态调整(如根据负载自动扩缩容Flink并行度)。
存储:时序数据库(InfluxDB)存储高频指标(如每秒GMV,时间序列),宽表(ClickHouse)存储聚合后的指标(如每小时GMV,列式存储支持复杂查询)。
查询:OLAP引擎(StarRocks)提供SQL接口,用户实时查询。
实时性:流处理低延迟(亚秒级),消息队列缓冲保证数据不丢失。
一致性:关键数据(如库存)采用分布式事务(Saga模式),库存变化事件通过事务协调器确保原子性;非关键数据用最终一致性加补偿,比如Flink作业定期校验库存数据一致性。
3) 【对比与适用场景】:
流处理引擎对比(Flink vs Spark Streaming):
| 对比项 | Flink (流处理) | Spark Streaming (流处理) |
| --- | --- | --- |
| 延迟 | 亚秒级(低延迟) | 几秒级(延迟较高) |
| 状态管理 | 内置状态管理,支持持久化(检查点) | 需额外组件(如Redis) |
| 适用场景 | 实时业务(如电商GMV、金融风控) | 对延迟要求不高的场景(如日志处理) |
| 注意点 | 需合理配置并行度,避免资源浪费;检查点配置影响恢复时间 | 适合数据量不大或延迟要求不高的场景;状态管理复杂 |
存储方案对比(时序数据库 vs OLAP):
| 对比项 | 时序数据库 (InfluxDB) | 宽表数据库 (ClickHouse) |
| --- | --- | --- |
| 数据模型 | 时间序列(时间+指标) | 列式存储,支持复杂查询 |
| 适合场景 | 高频、短周期数据(如每秒GMV) | 聚合后的指标(如每小时GMV、库存周转) |
| 查询性能 | 适合时间范围查询(如最近1小时GMV) | 适合复杂SQL查询(如按商品、区域聚合) |
| 注意点 | 数据过期策略(如保留7天) | 需定期刷新数据,避免数据过时 |
4) 【示例】:
假设订单系统产生订单事件(JSON格式,含订单ID、商品ID、金额、时间戳),库存系统产生库存变化事件(XML格式,含商品ID、库存量、操作类型)。数据采集:订单系统将事件推送到Kafka主题“order_events”,库存系统推送到“inventory_events”;通过Kafka Connect将XML转换为JSON,统一写入Kafka。处理:Flink作业读取两个主题,按商品ID聚合订单金额(计算GMV),同时读取库存事件计算库存周转(公式:平均库存=(初始库存+入库量-出库量)/时间周期,周转天数=(平均库存*30)/总出库量)。存储:实时GMV写入InfluxDB(表“gmv_realtime”,字段time、product_id、amount),聚合结果写入ClickHouse(表“gmv_aggregate”,字段time_hour、product_id、amount_sum)。查询:用户通过StarRocks查询“SELECT product_id, SUM(amount) FROM gmv_aggregate WHERE time > now() - interval 1 hour”,获取最近1小时GMV。
伪代码(Flink处理逻辑,包含检查点):
DataStream<OrderEvent> orderStream = env.addSource(kafkaSource("order_events"));
DataStream<InventoryEvent> inventoryStream = env.addSource(kafkaSource("inventory_events"));
DataStream<GmvResult> gmvStream = orderStream
.keyBy(order -> order.productId)
.window(TumblingProcessingTimeWindow.of(Time.seconds(10)))
.aggregate(new AggregateFunction<OrderEvent, AggregateState, GmvResult>() {
@Override
public AggregateState createAccumulator() {
return new AggregateState();
}
@Override
public AggregateState add(OrderEvent value, AggregateState acc) {
acc.amount += value.amount;
return acc;
}
@Override
public GmvResult getResult(AggregateState acc) {
return new GmvResult(acc.amount);
}
@Override
public AggregateState merge(AggregateState a, AggregateState b) {
return new AggregateState(a.amount + b.amount);
}
});
gmvStream.addSink(influxDbSink("gmv_realtime"));
// 检查点配置
env.getCheckpointConfig().setCheckpointingInterval(1000); // 1秒检查点
env.getCheckpointConfig().enableCheckpointing(1000); // 启用检查点
5) 【面试口播版答案】:各位面试官好,我来设计一个实时数据平台用于计算GMV和库存周转。首先,数据采集阶段,业务系统(订单、库存、支付等)通过消息队列(如Kafka)发布事件,解耦数据源,支持不同系统(如订单JSON、库存XML)通过转换层统一格式,保证高吞吐。处理阶段,用流计算引擎(Flink)实时聚合指标,比如GMV是订单金额的10秒滑动窗口聚合,库存周转通过库存和出库数据计算。存储方面,高频数据存时序数据库(InfluxDB),聚合数据存宽表(ClickHouse),查询用OLAP引擎(StarRocks)。实时性通过Flink低延迟(亚秒级)和消息队列缓冲,一致性对于库存等关键数据采用分布式事务(Saga模式),确保状态一致;非关键数据用最终一致性加补偿,比如Flink作业定期校验库存数据一致性。这样就能实时计算并查询GMV、库存周转等指标了。
6) 【追问清单】:
7) 【常见坑/雷区】: