
采用基于消息队列(如Kafka)的流处理架构,结合Flink或Spark Structured Streaming实时计算引擎,构建从数据采集、缓冲、实时计算到指标输出的完整流处理链路,实现广告曝光、点击率等指标的实时计算。
老师口吻:我们来拆解核心组件的作用。
| 框架/方案 | 定义 | 核心特性 | 适用场景 | 注意点 |
|---|---|---|---|---|
| Flink | 端到端流处理框架,支持状态管理、窗口、容错 | 状态管理高效、低延迟、端到端流处理、exactly-once语义 | 复杂状态计算(如用户行为序列分析)、秒级低延迟指标(如CTR) | 部署复杂度较高,状态存储需考虑持久化(如RocksDB) |
| Kafka + Spark Structured Streaming | 消息队列(Kafka)+ Spark批处理引擎的流处理 | 基于批处理优化,支持流批一体,代码复用 | 已有Spark批处理代码迁移、大规模数据批处理场景 | 状态管理依赖Spark,可能比Flink复杂,延迟略高(通常秒级) |
假设广告曝光事件为JSON,包含事件类型(exposure)、广告ID、用户ID等。生产者将事件推送到Kafka主题(如ad_exposure)。Flink作业处理逻辑伪代码:
DataStream<AdEvent> stream = env
.addSource(kafkaSource(...)) // 消费Kafka
.filter(event -> event.getType().equals("exposure")); // 筛选曝光事件
stream
.keyBy(adEvent -> adEvent.getAdId()) // 按广告ID分组
.window(TumblingEventTimeWindows.of(Time.seconds(10))) // 10秒滑动窗口
.aggregate(new AggregateFunction<AdEvent, Tuple2<Long, Long>, Tuple2<Long, Long>>() {
@Override
public Tuple2<Long, Long> createAccumulator() {
return new Tuple2<>(0L, 0L); // (曝光数, 点击数)
}
@Override
public Tuple2<Long, Long> add(AdEvent adEvent, Tuple2<Long, Long> acc) {
if (adEvent.getType().equals("exposure")) {
return new Tuple2<>(acc.f0 + 1, acc.f1);
} else if (adEvent.getType().equals("click")) {
return new Tuple2<>(acc.f0, acc.f1 + 1);
}
return acc;
}
@Override
public Tuple2<Long, Long> merge(Tuple2<Long, Long> a, Tuple2<Long, Long> b) {
return new Tuple2<>(a.f0 + b.f0, a.f1 + b.f1);
}
})
.process(new ProcessWindowFunction<Tuple2<Long, Long>, CTRResult, String, TimeWindow>() {
@Override
public void process(String adId, TimeWindow window, Iterable<Tuple2<Long, Long>> values, Context ctx, Collector<CTRResult> out) {
long exposure = values.iterator().next().f0;
long click = values.iterator().next().f1;
double ctr = exposure > 0 ? (click * 1.0 / exposure) : 0;
out.collect(new CTRResult(adId, window.getEnd(), ctr)); // 输出点击率
}
})
.addSink(redisSink(...)); // 存储到Redis或实时服务
面试官您好,关于实时计算广告曝光、点击率等指标,我会设计一个基于Kafka和Flink的流处理架构。首先,数据源(如广告曝光、点击事件)通过生产者发送到Kafka,作为缓冲区解耦生产与消费。然后,Flink消费Kafka数据流,通过状态管理维护实时统计(如曝光数、点击数),使用滑动窗口计算指标(如点击率=点击数/曝光数),结果存储到Redis或实时服务。核心是利用流处理实现低延迟计算,保证指标实时性。具体来说,Kafka负责数据缓冲和高吞吐,Flink负责实时计算和状态管理,通过窗口操作计算指标,最终输出到存储或服务,满足投放系统的实时监控需求。