讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在 Flink 中高效分流 Kafka 数据并分发至多路下游处理逻辑

轻明大大_1948

轻明大大_1948

发布时间:2026-07-31 21:36:25

|

460人浏览过

|

来源于php中文网

原创

如何在 Flink 中高效分流 Kafka 数据并分发至多路下游处理逻辑

本文详解如何基于 Apache Flink(1.17)实现低延迟、高可用的 Kafka 数据动态分流,避免多 execute() 阻塞问题,推荐使用侧输出(Side Output)或主题路由方案替代错误的多作业混跑模式。

本文详解如何基于 apache flink(1.17)实现低延迟、高可用的 kafka 数据动态分流,避免多 `execute()` 阻塞问题,推荐使用侧输出(side output)或主题路由方案替代错误的多作业混跑模式。

在 Flink 应用开发中,一个常见误区是将多个逻辑独立的处理流程封装为多个 StreamExecutionEnvironment.execute() 调用(如 Job1.consumeDataStream(...) 内部再次调用 env2.execute()),这会导致串行阻塞执行:第二个作业必须等待第一个作业完全结束才能启动,严重违背流式处理“持续运行、低延迟”的设计初衷。根据 Flink 官方文档,execute() 是同步阻塞方法;即使改用 executeAsync(),多作业共存也会牺牲高可用性(HA 不支持 Application Mode 下的多作业场景),且任一作业异常失败将导致整个 JobManager 关闭——这对生产系统是不可接受的风险。

✅ 正确解法:单作业内完成分流与并行处理
应将整个数据流拓扑构建在一个 StreamExecutionEnvironment 中,通过以下两种推荐方式实现“一源多路”:

方案一:使用 Side Output(侧输出)——轻量、低延迟、强一致性

适用于分流规则固定、下游处理逻辑耦合度较高(如共享状态、需统一 checkpoint)的场景。核心是定义多个 OutputTag,在 ProcessFunction 或 FlatMapFunction 中按条件将数据路由到不同侧输出通道:

// 定义侧输出标签
private static final OutputTag<String> TAG_DATA1 = new OutputTag<>("data1") {};
private static final OutputTag<String> TAG_DATA2 = new OutputTag<>("data2") {};
private static final OutputTag<String> TAG_DATA3 = new OutputTag<>("data3") {};

// 主流处理:解析 JSON 并分流
DataStream<ObjectNode> jsonStream = sourceStream.map(mapper::readTree);

// 使用 ProcessFunction 实现精准分流(替代多次 flatMap)
SingleOutputStreamOperator<ObjectNode> splitStream = jsonStream.process(new ProcessFunction<ObjectNode, ObjectNode>() {
    @Override
    public void processElement(ObjectNode node, Context ctx, Collector<ObjectNode> out) throws Exception {
        JsonNode components = node.get("component");
        if (components != null && components.isArray()) {
            for (JsonNode comp : components) {
                String code = comp.get("code").asText();
                if ("data1".equals(code)) {
                    ctx.output(TAG_DATA1, comp.get("hr").toString());
                } else if ("data2".equals(code)) {
                    ctx.output(TAG_DATA2, comp.get("hr").toString());
                } else if ("data3".equals(code)) {
                    ctx.output(TAG_DATA3, comp.get("value").toString());
                }
            }
        }
    }
});

// 提取各侧输出流
DataStream<String> data1Stream = splitStream.getSideOutput(TAG_DATA1);
DataStream<String> data2Stream = splitStream.getSideOutput(TAG_DATA2);
DataStream<String> data3Stream = splitStream.getSideOutput(TAG_DATA3);

// 各路独立处理(并行执行,共享 checkpoint)
data1Stream.map(value -> {
    // 调用 Flask API(建议异步非阻塞,见下方注意事项)
    RestAssured.given()
        .header("Content-Type", "application/json")
        .body("{\"data\":\"" + value + "\"}")
        .post("http://localhost:5002/fhr1");
    return "processed-by-job1:" + value;
}).name("Job1-Processor");

data2Stream.map(value -> {
    RestAssured.given()
        .header("Content-Type", "application/json")
        .body("{\"data\":\"" + value + "\"}")
        .post("http://localhost:5002/job2");
    return "processed-by-job2:" + value;
}).name("Job2-Processor");

// 共享 data3 流可被多路复用
data3Stream.map(value -> {
    // 可同时发送至多个 API 端点
    sendToFlask("http://localhost:5002/common", value);
    return "common-" + value;
}).name("Common-Processor");

方案二:Kafka 主题路由 —— 高解耦、易扩展、天然 HA

若各下游任务逻辑差异大、部署独立或需横向扩缩容,推荐将分流结果写入不同 Kafka Topic,再由独立 Flink 作业消费:

// 分流后分别写入不同 topic
data1Stream.sinkTo(KafkaSink.<String>builder()
    .setBootstrapServers("localhost:9092")
    .setTopic("job1-input")
    .setRecordSerializer(KafkaRecordSerializationSchema.builder()
        .setValueClassType(String.class)
        .build())
    .build());

data2Stream.sinkTo(KafkaSink.<String>builder()
    .setBootstrapServers("localhost:9092")
    .setTopic("job2-input")
    .setRecordSerializer(...)
    .build());

data3Stream.sinkTo(KafkaSink.<String>builder()
    .setBootstrapServers("localhost:9092")
    .setTopic("common-input")
    .build());

✅ 优势:每个下游作业可独立启停、扩缩容、升级;天然支持 Flink 高可用(Per-Job 模式);运维清晰,故障隔离。

⚠️ 关键注意事项

  • 禁止同步 HTTP 调用阻塞流:示例中 RestAssured.post() 是同步阻塞操作,会显著拖慢吞吐、升高延迟(当前 10s 根源)。应改用异步 HTTP 客户端(如 OkHttp + Callback / CompletableFuture)或消息队列(如 Kafka)解耦。
  • 移除 DataStreamUtils.collect():该方法会触发全量收集并阻塞执行,彻底破坏流式语义,仅用于调试,绝不可用于生产。
  • 校验并行度与资源:设置 env.setParallelism(4) 并确保 TaskManager 资源充足,避免因反压导致延迟飙升。
  • 启用 Checkpointing:添加 env.enableCheckpointing(5000) 保障 Exactly-Once 语义。

通过以上重构,端到端延迟可稳定控制在 毫秒级(:侧输出方案消除了进程级调度开销;Kafka 路由方案则利用其高吞吐与水平扩展能力。选择哪种方案取决于业务耦合度与运维复杂度权衡——但无论如何,单作业、无阻塞、异步化 是 Flink 高性能实践的核心原则。

相关文章

Kafka Eagle可视化工具
Kafka Eagle可视化工具

Kafka Eagle是一款结合了目前大数据Kafka监控工具的特点,重新研发的一块开源免费的Kafka集群优秀的监控工具。它可以非常方便的监控生产环境中的offset、lag变化、partition分布、owner等,有需要的小伙伴快来保存下载体验吧!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

相关专题

更多
kafka消费者组有什么作用
kafka消费者组有什么作用

kafka消费者组的作用:1、负载均衡;2、容错性;3、广播模式;4、灵活性;5、自动故障转移和领导者选举;6、动态扩展性;7、顺序保证;8、数据压缩;9、事务性支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3026

2024.01.12

kafka消费组的作用是什么
kafka消费组的作用是什么

kafka消费组的作用:1、负载均衡;2、容错性;3、灵活性;4、高可用性;5、扩展性;6、顺序保证;7、数据压缩;8、事务性支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

670

2024.02.23

rabbitmq和kafka有什么区别
rabbitmq和kafka有什么区别

rabbitmq和kafka的区别:1、语言与平台;2、消息传递模型;3、可靠性;4、性能与吞吐量;5、集群与负载均衡;6、消费模型;7、用途与场景;8、社区与生态系统;9、监控与管理;10、其他特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

644

2024.02.23

Java 流式处理与 Apache Kafka 实战
Java 流式处理与 Apache Kafka 实战

本专题专注讲解 Java 在流式数据处理与消息队列系统中的应用,系统讲解 Apache Kafka 的基础概念、生产者与消费者模型、Kafka Streams 与 KSQL 流式处理框架、实时数据分析与监控,结合实际业务场景,帮助开发者构建 高吞吐量、低延迟的实时数据流管道,实现高效的数据流转与处理。

710

2026.02.04

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

40

2026.10.28

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

120

2026.10.28

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

140

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

120

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn