
1) 【一句话结论】采用“消息队列+流处理引擎+时序存储”分层架构,以Kafka负责高吞吐数据采集,Flink实现低延迟实时计算,结合InfluxDB/HBase等时序数据库存储,确保每秒百万级日志处理延迟低于1秒。
2) 【原理/概念讲解】
数据采集层:选用Kafka作为消息队列,其分布式架构、高吞吐(单集群百万级QPS)、持久化存储特性,能像“高速数据中转站”一样缓冲百万级日志,避免处理端压力,同时支持多客户端消费。
数据处理层:采用Flink作为流处理引擎,其支持流处理、状态管理(键控状态)、窗口计算(如滚动/滑动窗口)的特性,能实现亚秒级延迟的实时计算(如1秒窗口内统计服务请求量),类比“实时数据处理大脑”,快速响应业务需求。
数据存储层:选用时序数据库(如InfluxDB),因日志是时间序列数据,需按时间维度查询(如按分钟/小时聚合指标),时序数据库的TSM存储引擎能高效处理时间范围查询,满足监控看板等场景需求。
3) 【对比与适用场景】
| 对比项 | Kafka(消息队列) | Flink(流处理引擎) | InfluxDB(时序存储) |
|---|---|---|---|
| 定义 | 分布式消息队列 | 流式计算框架 | 时间序列数据库 |
| 核心特性 | 高吞吐、持久化、多客户端消费 | 低延迟、状态管理、窗口计算 | 高效时间范围查询、TSM引擎 |
| 使用场景 | 日志采集、事件流中转 | 实时指标计算、窗口统计 | 监控看板、时间序列数据存储 |
| 注意点 | 分区扩容需重启消费端 | 状态管理需合理设计(内存+磁盘) | 数据量过大需分片 |
4) 【示例】
producer.send(new ProducerRecord("logs-topic", "log-id",
"{\"timestamp\":\"2023-10-26T10:00:00Z\",\"level\":\"INFO\",\"message\":\"...\"}"));
DataStream<String> logs = env.addSource(kafkaSource);
logs.map(log -> parseLog(log)) // 解析日志为结构化对象
.keyBy(log -> log.get("serviceId")) // 按服务分组
.window(TumblingProcessingTimeWindow.of(Time.seconds(1))) // 1秒滚动窗口
.aggregate(new AggregateFunction<Log, State, Long>() { // 计算请求量
@Override public State createAccumulator() { return new State(); }
@Override public Long getResult(State state) { return state.getRequestCount(); }
@Override public State add(Log log, State state) { state.increment(); return state; }
})
.addSink(hbaseSink); // 写入HBase存储
5) 【面试口播版答案】
“面试官您好,针对高并发日志实时监控平台,我设计的架构核心是分层处理,从采集到存储全链路优化延迟。首先数据采集层,选用Kafka作为消息队列,它的分布式架构能支撑百万级吞吐,像高速中转站一样缓冲日志,避免处理压力。处理层用Flink,支持流处理和状态管理,能实现1秒内的窗口计算和指标聚合,比如按服务分组的1秒滚动窗口统计请求量。存储层选InfluxDB,专门处理时间序列数据,支持快速时间范围查询,满足监控看板的需求。整体架构确保数据从采集到存储的延迟低于1秒,满足业务要求。”
6) 【追问清单】
7) 【常见坑/雷区】