0

0

如何优化 Flink 中阻塞任务执行的 Sink 性能

花韻仙語

花韻仙語

发布时间:2026-01-04 21:54:21

|

101人浏览过

|

来源于php中文网

原创

如何优化 Flink 中阻塞任务执行的 Sink 性能

flink 中自定义 `richsinkfunction` 因同步 i/o 或不当广播导致任务严重阻塞,可通过移除冗余广播、改用异步 i/o(asyncsink)并配合丢弃型 sink 彻底解决性能瓶颈

在您提供的代码中,SessionAPISink 继承自 RichSinkFunction 并执行大量 HTTP POST 请求,虽主观认为“异步”,但实际仍运行在 Flink 的同步 Sink 调用线程中(即 invoke() 方法阻塞执行),直接拖慢整个算子链路——这正是任务耗时从 5 分钟飙升至 10 分钟的根本原因。更关键的是,inProgressSessionStream.broadcast() 这一操作不仅无必要,反而引发严重性能退化:广播流会将每条数据复制到所有并行子任务,使网络传输量和 sink 调用次数呈线性倍增(4 并行度 → 每条数据被处理 4 次),极大加剧背压与资源争用。

✅ 正确解法是彻底转向 Flink 原生支持的 异步 I/O 模式(AsyncSinkFunction + AsyncDataStream),而非在 RichSinkFunction 中自行封装 HTTP 客户端。以下是推荐重构方案:

Content at Scale
Content at Scale

SEO长内容自动化创作平台

下载

1. 替换为异步 I/O 流程(推荐 Flink 1.17+ Async Sink)

// 使用 AsyncSinkBuilder(Flink 1.17+ 推荐方式)
AsyncSinkFunction, Void> asyncSink = new AsyncSinkFunction, Void>() {
    private transient CloseableHttpClient httpClient;

    @Override
    public void open(Configuration parameters) throws Exception {
        this.httpClient = HttpClients.createDefault();
    }

    @Override
    public void invoke(List elements, Context context) throws Exception {
        // 构建异步 POST 请求(非阻塞)
        HttpPost post = new HttpPost("https://your-api/endpoint");
        String json = new ObjectMapper().writeValueAsString(elements);
        post.setEntity(new StringEntity(json, ContentType.APPLICATION_JSON));

        // 异步提交,不阻塞主线程
        CompletableFuture future = CompletableFuture
            .supplyAsync(() -> {
                try {
                    return httpClient.execute(post);
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }, Executors.newFixedThreadPool(10)); // 独立线程池控制并发

        // 注册回调,成功则 complete,失败可重试或记录日志
        future.whenComplete((response, throwable) -> {
            if (throwable != null) {
                LOG.error("Async POST failed", throwable);
                context.collect(null); // 可选:标记失败
            }
        });
    }
};

// 应用异步 Sink(注意:需搭配 DiscardingSink 或自定义结果处理)
inProgressSessionStream
    .sinkTo(AsyncSink.builder()
        .asyncSink(asyncSink)
        .build())
    .uid("Async-Session-API-Sink")
    .name("Async Session API Sink");

2. 若使用旧版 Flink(
// 先通过 AsyncDataStream 转为异步流
DataStream asyncResultStream = AsyncDataStream.unorderedWait(
    inProgressSessionStream,
    new SessionAsyncFunction(config), // 实现 AsyncFunction
    60, TimeUnit.SECONDS,
    AsyncDataStream.OutputMode.UNORDERED
);

// 后续接 DiscardingSink(仅触发执行,不消费结果)
asyncResultStream.addSink(new DiscardingSink<>())
    .uid("Discard-Async-Result")
    .name("Discard Async Result");

⚠️ 关键注意事项:

  • 禁止 broadcast() 非必要流:侧输出流(side output)本身已按 key 分区,broadcast() 会破坏数据局部性并指数级放大负载;
  • 避免在 open()/invoke() 中创建重量级客户端:如 CloseableHttpClient 应复用(推荐单例或 @transient + open() 初始化);
  • 严格控制异步线程池大小:过大会耗尽 TaskManager 内存,建议设为 2–4 × 并行度;
  • 必须处理异常与超时:未捕获的 CompletableFuture 异常会导致任务静默失败;
  • 监控背压与异步队列积压:通过 Flink Web UI 观察 AsyncWaitOperator 的 asyncWaitTime 和 numRecordsInPerSecond 指标。

通过以上改造,I/O 操作完全脱离 Flink 主工作线程,吞吐量可提升 2–5 倍,同时保障端到端精确一次(exactly-once)语义(需后端 API 支持幂等)。切记:Flink 的“异步”必须由框架原生机制保障,手动 Thread.start() 或 ExecutorService.submit() 无法规避反压传导。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

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

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

478

2023.08.10

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

60

2025.12.01

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

319

2023.11.09

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

397

2023.11.14

HTTP 503错误解决方法
HTTP 503错误解决方法

HTTP 503错误表示服务器暂时无法处理请求。想了解更多http错误代码的相关内容,可以阅读本专题下面的文章。

1475

2024.03.12

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1887

2024.08.16

Golang 分布式缓存与高可用架构
Golang 分布式缓存与高可用架构

本专题系统讲解 Golang 在分布式缓存与高可用系统中的应用,涵盖缓存设计原理、Redis/Etcd集成、数据一致性与过期策略、分布式锁、缓存穿透/雪崩/击穿解决方案,以及高可用架构设计。通过实战案例,帮助开发者掌握 如何使用 Go 构建稳定、高性能的分布式缓存系统,提升大型系统的响应速度与可靠性。

60

2026.01.09

java学习网站推荐汇总
java学习网站推荐汇总

本专题整合了java学习网站相关内容,阅读专题下面的文章了解更多详细内容。

61

2026.01.08

java学习网站汇总
java学习网站汇总

本专题整合了java学习网站相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.01.08

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.2万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.1万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号