/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */
#content_views .toc,
/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */
#content_views.markdown_views > p:empty:has(+ .toc),
#content_views.markdown_views > .toc + p:empty,
/* 富文本旧版目录标记 */
#content_views.htmledit_views #main-toc,
#content_views.htmledit_views #hr-toc,
#content_views.htmledit_views p[id*=\”-toc\”] {
display: none !important;
}
/* 目录去掉后,紧跟的首个标题不再多出一块上边距 */
#content_views.markdown_views > .toc + h1,
#content_views.markdown_views > .toc + h2,
#content_views.markdown_views > .toc + h3,
#content_views.markdown_views > .toc + h4,
#content_views.markdown_views > .toc + p:empty + h1,
#content_views.markdown_views > .toc + p:empty + h2,
#content_views.markdown_views > .toc + p:empty + h3,
#content_views.markdown_views > .toc + p:empty + h4 {
margin-top: 0 !important;
}
一、为什么需要 Flink 做实时计算
传统离线计算以天或小时为调度周期,数据从产生到产出结果往往存在明显延迟。而业务侧对“实时性”的要求越来越高:风控要在毫秒级拦截异常交易,推荐要在用户点击后立刻调整结果,监控要在故障发生的第一时间告警。Flink 以事件驱动、低延迟、高吞吐、Exactly-Once 语义和流批一体为核心特性,成为实时计算领域的主流引擎。
下面结合几个典型行业场景,说明 Flink 实时计算到底能解决什么问题。
二、场景一:实时风控与反欺诈
金融、支付、电商平台都需要在交易发生的瞬间判断风险。典型需求包括:同一账号短时间多次登录、异地异常下单、单卡高频小额支付、设备指纹异常聚集等。
实现思路
- 通过 Flink 消费交易日志、登录日志、设备埋点等 Kafka 数据源;
- 使用 keyBy 按用户 ID 或设备 ID 分组,结合 KeyedProcessFunction 维护用户状态;
- 使用滚动窗口或滑动窗口统计“最近 1 分钟交易笔数”“最近 10 分钟登录城市数”等指标;
- 规则命中后写入告警 Topic 或调用风控决策服务,实现毫秒级拦截。
DataStream<Transaction> transactions = env
.addSource(new FlinkKafkaConsumer<>("tx-topic", new TransactionSchema(), props));
transactions
.keyBy(Transaction::getUserId)
.window(TumblingEventTimeWindows.of(Time.minutes(1)))
.aggregate(new CountAggregate())
.filter(count -> count > 20)
.addSink(new RiskAlertSink());
相比离线跑批,Flink 方案把风险识别从“T+1”缩短到秒级甚至毫秒级,显著降低资损。
三、场景二:实时数仓与实时大屏
电商大促、运营看板、业务监控大屏都要求数据“秒级可见”。典型链路是:业务库 Binlog → Kafka → Flink 清洗与聚合 → ClickHouse / Doris / HBase → BI 大屏。
关键能力
- 维表关联:通过 Lookup Join 关联商品、门店、用户维度表,补齐宽表字段;
- 多流 Join:订单流与支付流按订单号做双流 Join,计算支付转化率;
- 分层建模:ODS → DWD → DWS → ADS,Flink 负责逐层实时加工;
- 结果幂等写入:借助主键 Upsert 保证重复消费不产生脏数据。
INSERT INTO ads_gmv_1min
SELECT
window_start,
window_end,
shop_id,
SUM(pay_amount) AS gmv,
COUNT(DISTINCT user_id) AS buyer_cnt
FROM TABLE(
TUMBLE(TABLE dwd_order, DESCRIPTOR(event_time), INTERVAL '1' MINUTE)
)
WHERE order_status = 'PAID'
GROUP BY window_start, window_end, shop_id;
使用 Flink SQL 可以大幅降低实时数仓的开发门槛,让数据分析师也能直接参与实时指标建设。
四、场景三:实时推荐与用户行为分析
推荐系统需要根据用户当前行为实时调整召回和排序。例如用户刚浏览了某类商品,首页就应立刻出现相关推荐。
- Flink 消费用户点击、曝光、加购、收藏等埋点流;
- 按用户维度维护近期行为序列(如最近 50 条点击),写入 Redis 供在线服务读取;
- 实时统计商品热度、类目偏好,更新特征平台中的实时特征;
- 结合 Interval Join 把曝光流与点击流对齐,实时计算 CTR 等效果指标。
这类场景的核心是低延迟特征更新,Flink 的状态管理和窗口能力正好匹配。
五、场景四:实时监控告警与日志分析
运维和 SRE 团队常用 Flink 处理海量日志与指标数据:
- 服务日志实时解析,按错误码、接口、机器维度聚合 QPS 与错误率;
- 基于 CEP(复杂事件处理)识别“连续 3 次超时后紧跟一次熔断”这类事件序列;
- 指标超过阈值时推送钉钉、企业微信或短信告警;
- 结合异常检测算法做趋势预测,提前发现容量瓶颈。
Pattern<LogEvent, ?> pattern = Pattern.<LogEvent>begin("timeout")
.where(evt -> "TIMEOUT".equals(evt.getType()))
.times(3).consecutive()
.next("circuit")
.where(evt -> "CIRCUIT_BREAK".equals(evt.getType()));
CEP.pattern(logStream.keyBy(LogEvent::getService), pattern)
.process(new AlertProcessFunction())
.addSink(new AlertSink());
六、场景五:实时 ETL 与数据同步
很多企业需要把业务库变更实时同步到数据湖或下游系统。Flink CDC 可以直接读取 MySQL、PostgreSQL、Oracle 的 Binlog,实现全量与增量一体化同步。
- 全量快照 + 增量日志自动切换,无需额外调度;
- 支持字段过滤、脱敏、类型转换等实时清洗;
- 可同时写入 Kafka、Hudi、Iceberg、Doris 等多个下游;
- 配合 Checkpoint 保证断点续传与 Exactly-Once。
CREATE TABLE mysql_orders (
id BIGINT,
user_id BIGINT,
amount DECIMAL(10, 2),
PRIMARY KEY (id) NOT ENFORCED
) WITH (
'connector' = 'mysql-cdc',
'hostname' = 'localhost',
'port' = '3306',
'username' = 'root',
'password' = '******',
'database-name' = 'shop',
'table-name' = 'orders'
);
七、场景六:实时报表与在线特征服务
除上述场景外,Flink 还广泛用于:
| 电商 | 实时 GMV、库存预警、优惠券核销监控 | 秒级 |
| 金融 | 实时反洗钱、交易监控、额度计算 | 毫秒到秒级 |
| 物流 | 运单轨迹实时计算、异常件识别 | 秒级 |
| 游戏 | 实时在线人数、道具消耗、外挂检测 | 秒级 |
| 物联网 | 设备状态监控、预测性维护 | 毫秒到秒级 |
八、落地时的几个关键考量
九、小结
Flink 的实时计算能力几乎覆盖了所有“数据产生即需要价值”的业务场景:实时风控、实时数仓、实时推荐、实时监控、实时 ETL 与在线特征服务。选型时不必追求“全都要实时”,而应结合业务对延迟的真实要求、数据规模和团队运维能力,从一两个高价值场景切入,逐步沉淀实时计算平台能力。
网硕互联帮助中心





评论前必须登录!
注册