51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

设计一个游戏活动(如“春节庆典”活动)的实时统计系统,要求在活动期间(24小时)能实时展示活动数据(如参与人数、消费金额、道具发放数量),并支持高并发请求。请说明数据流(如用户行为数据通过埋点进入Kafka,Flink实时处理)、数据存储(Redis缓存实时数据,Elasticsearch存储历史数据)及低延迟查询方案。

多益网络职能类难度:困难

答案

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) 【追问清单】:

  • 问:如何处理数据清洗?比如用户误操作或无效数据?
    回答要点:在Flink处理链路中增加数据清洗步骤,通过状态后端(如Redis或RocksDB)维护用户行为的有效性状态,过滤非法操作或重复提交的无效数据,确保聚合计算基于有效数据。
  • 问:高并发下Redis的集群方案?比如如何保证数据一致性和读写性能?
    回答要点:采用Redis Cluster(分片+主从复制),结合哨兵实现高可用,通过读写分离(读请求路由到从节点,写请求路由到主节点)提高并发能力,并配置RDB/AOF持久化,保证数据不丢失。
  • 问:Flink的窗口类型选择?比如滚动窗口还是滑动窗口?
    回答要点:根据统计粒度选择,如5秒滚动窗口(每5秒计算一次参与人数),滑动窗口(如1分钟内统计消费金额),结合业务需求调整窗口大小,平衡实时性和数据准确性。
  • 问:系统容错性具体如何保障?比如Kafka或Flink作业故障时?
    回答要点:Kafka通过持久化确保消息不丢失,Flink通过检查点机制实现故障恢复,数据在处理过程中不会丢失,故障后可快速重启作业,恢复数据流。

7) 【常见坑/雷区】:

  • 忽略数据清洗导致统计错误:无效数据(如用户重复提交)未被过滤,导致统计结果偏差。
  • 高并发下Redis集群配置不当:未设置读写分离或淘汰策略,导致缓存压力过大,查询延迟过高。
  • 容错机制描述绝对化:声称“确保数据不丢失”,未说明Kafka持久化、Flink检查点的局限性,可能被反问具体故障场景的处理。
  • 缓存未预热:活动开始前未提前加载热点数据到Redis,初始查询延迟较高,影响用户体验。
  • 查询方案单一:仅依赖Redis缓存,未考虑Elasticsearch的历史数据查询能力,用户无法查看历史趋势,导致业务分析受限。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1