
1) 【一句话结论】采用CDC(Debezium)捕获数据库变更→Kafka解耦传输→Flink低延迟计算→Redis集群缓存→Nginx负载均衡的架构,通过各环节量化延迟控制(CDC 50-100ms,Kafka <1ms,Flink <100ms,Redis <0.1ms),并集成Prometheus+自动扩容机制,确保航班状态变更到前端显示延迟≤1秒,峰值流量时动态调整Kafka分区数和Redis节点。
2) 【原理/概念讲解】老师口吻解释关键组件:
3) 【对比与适用场景】
| 技术组件 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| CDC(如Debezium) | 数据库变更捕获工具 | 实时捕获数据库变更,生成事件 | 航班系统数据库的变更同步 | 需配置数据库连接和表监控,延迟实测50-100ms |
| Kafka | 分布式消息队列 | 高吞吐、持久化、高可用、顺序保证 | 实时数据管道,解耦数据源与消费端 | 合理设计分区数(如按航班ID或时间分区),避免单分区过载 |
| Flink | 流处理引擎 | 毫秒级延迟、状态管理、容错、窗口计算 | 实时计算(如统计、聚合) | 配置并行度需结合业务量,避免资源浪费 |
| Redis集群 | 分布式缓存 | 高性能、持久化、支持数据结构、集群扩容 | 前端缓存,加速数据访问 | 设置缓存过期时间,避免击穿/雪崩 |
| Nginx | 负载均衡 | 高并发、反向代理、动态扩容 | 前端请求分发 | 配置upstream动态添加节点,应对流量峰值 |
4) 【示例】
connectors:
- name: flight_db_cdc
config:
database.hostname: db-server
database.port: 3306
database.user: cdc_user
database.password: cdc_pass
database.dbname: flight_system
database.server.id: 1234
database.server.name: flight_db
schema.history.kafka.topic: flight_schema_history
schema.history.kafka.bootstrap.servers: kafka:9092
table.include.list: flight_status
offset.storage.type: file
offset.storage.path: /tmp/cdc_offset
job.id: flight_cdc_job
{
"flight_id": "CA1234",
"status": "delayed",
"timestamp": 1672531200,
"event_type": "UPDATE"
}
// 读取Kafka主题"flight_status_update"
DataStream<FlightStatusEvent> stream = env.fromSource(kafkaSource, ...);
// 转换为状态更新
DataStream<FlightStatus> updatedStream = stream.map(event -> {
return new FlightStatus(event.getFlightId(), event.getStatus(), event.getTimestamp());
});
// 写入Redis集群
updatedStream.addSink(redisSink);
def update_flight_status(flight_id, status):
# 互斥锁防止缓存击穿
with redis.lock(f"flight:{flight_id}:status_lock", timeout=10):
redis.set(f"flight:{flight_id}:status", status, ex=60) # 60秒过期
upstream cache_cluster {
server 192.168.1.1:6379;
server 192.168.1.2:6379;
server 192.168.1.3:6379;
# 流量峰值时动态添加
server 192.168.1.4:6379;
}
location /flight/ {
proxy_pass http://cache_cluster;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 采集Kafka分区数、Redis QPS等
- job_name: kafka
metrics_path: /metrics
scheme: http
static_configs:
- targets: ['kafka:9092']
- job_name: redis
metrics_path: /metrics
scheme: http
static_configs:
- targets: ['redis:6379']
5) 【面试口播版答案】
面试官您好,针对航空机场航班动态实时更新(延迟<1秒、处理峰值流量)的需求,我的方案核心是构建“数据实时捕获-解耦传输-低延迟计算-快速响应-动态扩容”的闭环架构。首先,通过CDC(如Debezium)监听航班数据库的变更(如航班状态更新),实时捕获变更事件并推送到Kafka,保证数据源变更的实时性。Kafka作为消息队列,解耦数据源与消费端,通过消息重试(失败后重试3次)和幂等性(消息唯一标识)确保消息不丢失且有序。接着,Flink流处理引擎以毫秒级延迟(配置并行度为CPU核心数的2倍,测试延迟80ms)消费Kafka消息,对航班状态进行计算(如统计延误航班数量),并将结果写入Redis集群。前端请求时,直接从Redis获取数据,响应时间≤0.5秒。同时,通过Nginx负载均衡将请求分发到多个Redis节点,当流量峰值时,动态增加Redis节点(如从3个到6个)或调整Kafka分区数(如从3个到6个),提升处理能力。通过Prometheus监控Kafka分区数、Redis QPS等指标,当达到阈值(如Kafka分区数利用率>90%)时,自动扩容Kafka分区或Redis节点,确保系统稳定。这样,从航班系统状态变更到前端显示的延迟控制在1秒以内,并能平稳处理峰值流量。
6) 【追问清单】
7) 【常见坑/雷区】