
1) 【一句话结论】采用“流式数据采集-实时计算处理-实时数据库存储-可视化工具展示”的链路,通过消息队列保障数据传输可靠性,流计算保障低延迟实时性,结合最终一致性或分布式事务保障数据一致性。
2) 【原理/概念讲解】老师口吻,解释核心环节:
3) 【对比与适用场景】
| 方案 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 流式计算(Flink) | 实时处理持续数据流 | 低延迟(秒级)、状态管理、容错 | 需要实时指标(如销量、市场份额) | 需要熟练开发,资源消耗较高 |
| 批处理(Spark批) | 定期处理历史数据 | 高吞吐、适合离线分析 | 历史报表、数据挖掘 | 无法满足实时性要求 |
| 消息队列(Kafka) | 分布式消息系统 | 高吞吐、持久化、顺序保证 | 数据采集中作为缓冲 | 需要管理集群,消息积压风险 |
4) 【示例】
假设销售系统通过Kafka生产者推送销量数据(JSON格式:{"product_id": "A001", "sales": 100, "timestamp": "2024-01-01T10:00:00Z"}),Flink作业消费该主题,计算每个产品的实时销量和市场份额(市场份额=该产品销量/总销量),然后写入ClickHouse的sales_table表。伪代码示例(Flink SQL):
-- Kafka输入
CREATE TABLE sales_kafka (
product_id STRING,
sales BIGINT,
ts TIMESTAMP(3)
) WITH (
'connector' = 'kafka',
'topic' = 'sales_topic',
'properties.bootstrap.servers' = 'kafka:9092',
'format' = 'json'
);
-- 计算总销量和市场份额
CREATE TABLE sales_metrics (
product_id STRING,
sales BIGINT,
market_share DOUBLE
) WITH (
'connector' = 'clickhouse',
'url' = 'jdbc:clickhouse://clickhouse:8123',
'table' = 'sales_metrics'
);
INSERT INTO sales_metrics
SELECT
product_id,
SUM(sales) AS sales,
SUM(sales) / SUM(SUM(sales)) OVER () AS market_share
FROM sales_kafka
GROUP BY product_id, ts;
展示部分:用Superset连接ClickHouse,创建仪表盘,包含“实时销量”“市场份额”等卡片。
5) 【面试口播版答案】
“面试官您好,针对构建销售数据实时看板的需求,我设计了一套‘流式采集-实时计算-实时存储-可视化展示’的方案。首先,数据采集阶段,从销售系统、CRM等多源系统通过API或消息队列(如Kafka)实时推送销量数据;然后,数据处理阶段,用流计算框架(如Flink)消费数据,实时计算销量、市场份额等指标;接着,数据存储阶段,写入实时数据库(如ClickHouse),支持秒级查询;最后,展示阶段,用可视化工具(如Superset)连接实时数据库,生成包含销量、市场份额的实时看板。保障实时性方面,消息队列确保数据传输低延迟,流计算处理延迟控制在秒级;一致性保障通过消息队列的持久化保证数据不丢失,结合最终一致性(如事件溯源)确保数据一致性,避免强一致性带来的性能损失。”
6) 【追问清单】
7) 【常见坑/雷区】