
1) 【一句话结论】:采用“Kafka-Flink实时处理链路+Redis热点缓存+Elasticsearch历史存储”的架构,通过解耦数据流、实时聚合计算,确保活动期间高并发下的低延迟数据展示,同时兼顾数据清洗与容错。
2) 【原理/概念讲解】:用户行为数据(如参与、消费、领道具事件)通过前端埋点,实时发送到Kafka(消息队列),作为数据中转站,解耦数据生产与消费。Flink作为流处理引擎,消费Kafka数据,进行实时聚合(如5秒窗口统计参与人数、消费金额),计算结果分为两路:一路写入Redis(内存数据库),缓存热点数据(如当前参与人数),支持秒级查询;另一路写入Elasticsearch(搜索引擎),存储历史数据,支持复杂查询(如按时间范围分析消费趋势)。Redis通过布隆过滤器过滤无效请求,减少压力;Elasticsearch的索引结构支持聚合分析。系统通过Kafka持久化、Flink检查点实现容错,确保数据不丢失。
3) 【对比与适用场景】:
| 组件 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| Redis | 内存键值数据库,支持缓存、会话、分布式锁等 | 读写延迟低(毫秒级),支持数据持久化(RDB/AOF) | 实时数据展示、热点数据缓存、高并发读写 | 数据易失性(内存),需合理淘汰策略 |
| Elasticsearch | 分布式搜索引擎,基于Lucene | 支持全文检索、聚合分析、高并发查询 | 历史数据存储、复杂查询、趋势分析 | 写延迟较高(秒级),适合非实时查询 |
4) 【示例】:用户行为数据示例(JSON):
{
"event_type": "join",
"user_id": "u123",
"timestamp": "2024-01-22T12:00:00Z",
"amount": 0
}
{
"event_type": "spend",
"user_id": "u123",
"timestamp": "2024-01-22T12:01:30Z",
"amount": 50
}
{
"event_type": "receive_prop",
"user_id": "u123",
"timestamp": "2024-01-22T12:02:00Z",
"prop_id": "p1"
}
Kafka生产者(伪代码):
producer = KafkaProducer(bootstrap_servers='kafka:9092', value_serializer=lambda v: json.dumps(v).encode('utf-8'))
for event in user_events:
producer.send('game_activity_topic', value=event)
Flink处理(Java伪代码,DataStream API):
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<Event> stream = env
.addSource(new KafkaSource(...))
.map(new EventParser())
.keyBy(Event::getEventType)
.window(TumblingEventTimeWindows.of(Time.seconds(5)))
.reduce(new Aggregator())
.map(new ResultMapper())
.addSink(new RedisSink())
.addSink(new ElasticsearchSink());
Redis写入(伪代码):
redis.set('activity_participants', result.get("participants"))
redis.set('activity_spend', result.get("spend"))
redis.set('activity_props', result.get("props"))
Elasticsearch写入(伪代码):
es.index(index='game_activity', body={
'event_type': result.get("event_type"),
'participants': result.get("participants"),
'spend': result.get("spend"),
'props': result.get("props"),
'timestamp': result.get("timestamp")
})
5) 【面试口播版答案】:面试官您好,针对春节庆典活动的实时统计需求,我设计的方案核心是构建一个“实时数据管道+缓存+搜索引擎”的架构,确保高并发下的低延迟展示。具体来说,用户行为数据(如参与、消费、领道具事件)通过前端埋点,实时推送到Kafka(消息队列),作为数据中转站解耦生产者和消费者。Flink作为流处理引擎,消费Kafka数据,进行实时聚合计算(如每5秒统计参与人数、消费金额),计算结果分为两路:一路写入Redis(内存数据库),缓存热点数据,支持秒级查询(如展示当前参与人数);另一路写入Elasticsearch(搜索引擎),存储历史数据,支持复杂查询(如按时间范围查看消费趋势)。对于数据清洗,我们在Flink处理链路中增加过滤步骤,过滤非法操作或重复提交的无效数据,通过Redis状态管理保证清洗逻辑的一致性。高并发下,我们配置Kafka分区数为10(根据历史峰值调整),Flink并行度为20,Redis采用Cluster集群+读写分离,读请求路由到从节点,写请求路由到主节点,并设置LRU淘汰策略,优先保留热点数据。系统通过Kafka持久化、Flink检查点实现容错,确保数据不丢失,同时延迟控制在秒级内,满足活动期间实时展示的需求。
6) 【追问清单】:
7) 【常见坑/雷区】: