前言

最近一段时间,接触到公司flink代码,修改时遇到一个flink常见问题,就是上游Producer生产数据的效率大于下游Consumer的消费速度,所以查阅一些大佬的资料,将这一问题记录,后续系统学习flink的时候复习一下

Flink 流处理为什么需要网络流控?

分析一个简单的 Flink 流任务,下图是一个简单的Flink流任务执行图:任务首先从 Kafka 中读取数据、 map 算子对数据进行转换、keyBy 按照指定 key 对数据进行分区(相同 key 的数据经过 keyBy 后分到同一个 subtask 实例中),keyBy 后对数据接着进行 map 转换,然后使用 Sink 将数据输出到外部存储。

在大数据处理中,无论是批处理还是流处理,单点处理的性能总是有限的,我们的单个 Job 一般会运行在多个节点上,多个节点共同配合来提升整个系统的处理性能。图中,任务被切分成 4 个可独立执行的 subtask( A0、A1、B0、B1),在数据处理过程中,就会存在 shuffle(数据传输)的过程。例如,subtask A0 处理完的数据经过 keyBy 后发送到 subtask B0、B1 所在节点去处理。
那么问题来了,下图中,上游 Producer 向下游 Consumer 发送数据,在发送端和接受端都有相应的 Send Buffer 和 Receive Buffer,但是上游 Producer 生成数据的速率比下游 Consumer 消费数据的速率快。Producer 生产数据 2MB/s, Consumer 消费数据 1MB/s,Receive Buffer 只有 5MB,所以过了5秒后,接收端的 Receive Buffer 满了。(可以把下图中的 Producer 当做上面案例中的 subtask A0,把下图中的 Consumer 当做上面案例中的 subtask B0)

下游接收区的 Receive Buffer 有限,如果上游一直有源源不断的数据,那么将会面临着以下两个情况:

  1. 下游消费者会丢弃新到达的数据,因为下游消费者的缓冲区放不下
  2. 为了不丢弃数据,所以下游消费者的 Receive Buffer 持续扩张,最后耗尽消费者的内存,OOM,程序挂掉

这两种情况在生产环境都是不能接受的,第一种会把数据丢弃、第二种会把我们的应用程序挂掉。所以,该问题的解决方案不应该是下游 Receive Buffer 一直累积数据,而是上游 Producer 发现下游 Consumer 处理比较慢之后,应该在 Producer 端做出限流的策略,防止在下游 Consumer 端无限制的数据堆积。

那上游 Producer 端该如何做限流呢?可以采用下图所示静态限流的策略:

下游 Consumer 端会频繁地向上游 Producer 端进行动态反馈,告诉 Producer 下游 Consumer 的负载能力,从而 Producer 端动态调整向下游 Consumer 发送数据的速率实现 Producer 端的动态限流。当 Consumer 端处理较慢时,Consumer 将负载反馈到 Producer 端,Producer端会根据反馈适当降低 Producer 自身从上游或者 Source 端读数据的速率来降低向下游 Consumer 发送数据的速率。当 Consumer 处理负载能力提升后,又及时向 Producer 端反馈,Producer 会通过提升从上游或 Source 端读数据的速率来提升向下游发送数据的速率。通过这个动态反馈来提升整个系统的吞吐量。

补充一点,如下图所示,假如我们的 Job 分为 Task A、B、C,Task A 是 Source Task、Task B 处理数据、Task C 是 Sink Task。假如 Task C 由于各种原因吞吐量降低,会将负载信息反馈给 Task B,Task B 会降低向 Task C 发送数据的速率,此时如果 Task B 如果还是一直从 Task A 读取数据,那么按照同样的道理,数据会把 Task B 的 Send Buffer 和 Receive Buffer 撑爆,又会出现上面描述的问题。所以,当 Task B 的 Send Buffer 和 Receive Buffer 被用完后,Task B 会用同样的原理将负载信息反馈给 Task A,Task A 收到 Task B 的负载信息后,会降低 给 Task B 发送数据的速率,以此类推。

上面这个流程,就是 Flink 动态限流(反压机制)的简单描述。我们可以看到 Flink 的反压其实是从下游往上游传播的,一直往上传播到 Source Task 后,Source Task 最终会降低从 Source 端读取数据的速率。如果下游 Task C 的负载能力提升后,会及时反馈给 Task B,于是 Task B 会提升往 Task C 发送数据的速率,Task B 又将负载提升的信息反馈给 Task A,Task A 就会提升从 Source 端读取数据的速率,从而提升整个系统的负载能力。

转载自: 一文搞懂 Flink 网络流控与反压机制.

Flink初探之 动态限流相关推荐

  1. spring gateway 限流持久化_Spring Cloud Gateway 扩展支持动态限流

    之前分享过 一篇 <Spring Cloud Gateway 原生的接口限流该怎么玩>, 核心是依赖Spring Cloud Gateway 默认提供的限流过滤器来实现 原生Request ...

  2. SpringBoot 2.0 + 阿里巴巴 Sentinel 动态限流实战

    转载 https://www.cnblogs.com/smallSevens/p/11531534.html 前言 在从0到1构建分布式秒杀系统和打造十万博文系统中,限流是不可缺少的一个环节,在系统能 ...

  3. 【Flink】Flink 消费 kafka 实现 限流处理 RateLimiter

    文章目录 1.概述 2.案例 2.1 案例1 纪念一波,九师兄博客热门订阅专栏时常名列前茅,我飘了,哈哈哈哈,得意的笑 1.概述 首先看看 [java]高并发之限流 RateLimiter使用 这个去 ...

  4. 高并发整体可用性:一文详解降级、限流和熔断

    水满则溢,月盈则亏,任何事物都不可能无限制的发展,我们的系统服务能力也一样. 当随着流量的不断增长,达到或超过服务本身的可承载范围,系统服务的自我保护机制的建立就显得很重要了. 本文希望可以用最通俗的 ...

  5. 阿里云二面:你对限流了解多少?

    今天来说说限流的相关内容,包括常见的限流算法.单机限流场景.分布式限流场景以及一些常见限流组件. 当然在介绍限流算法和具体场景之前我们先得明确什么是限流,为什么要限流?. 任何技术都要搞清它的来源,技 ...

  6. 如何设计秒杀服务器的限流策略

    如果平时系统的访问量只有一万,而最大承受限制为五万,在秒杀时刻的瞬间,访问量突然增加到100W,此事系统一定会因访问量过大而宕机,此时就应该设计一个限流策略,使服务器能接收和处理的请求减少. 秒杀限流 ...

  7. Spring Cloud Gateway(限流)

    在高并发的应用中,限流是一个绕不开的话题.限流可以保障我们的 API 服务对所有用户的可用性,也可以防止网络攻击. 一般开发高并发系统常见的限流有:限制总并发数(比如数据库连接池.线程池).限制瞬时并 ...

  8. spring boot框架_redislimiter-spring-boot分布式限流框架

    1. 修改项目resources/application.yml文件 server: port: 8888 #端口spring: application: name: demo1 #应用名称必须要配置 ...

  9. 技术圈儿002---高并发整体可用性:一文详解降级、限流和熔断

    水满则溢,月盈则亏,任何事物都不可能无限制的发展,我们的系统服务能力也一样. 当随着流量的不断增长,达到或超过服务本身的可承载范围,系统服务的自我保护机制的建立就显得很重要了. 本文希望可以用最通俗的 ...

最新文章

  1. 高并发之存储篇:关注下索引原理和优化吧!躲得过实践,躲不过面试官!
  2. 谷歌、OpenAI等警告:BERT、GPT-3等大型语言模型都有一个重大缺陷,很危险...
  3. cocos2dx 学习代码记录
  4. php n维数组扁平化,js嵌套的数组扁平化:将多维数组变成一维数组以及push()与concat()区别的讲解...
  5. 安卓开发-Activity中finish() onDestroy() 和System.exit()的区别
  6. java聚合excel_java操作excel
  7. CSS之深入理解 flex 布局以及计算
  8. linux用户和组基础
  9. [SOJ #538]好数 [CC]FAVNUM(2019-8-6考试)
  10. iphone--使用NSUserDefaults存储数据
  11. React学习笔记2017-12-31
  12. centos6 ab性能测试web服务器
  13. Linux驱动开发|WiFi驱动
  14. ML Note 3.4 - 数据降维算法 PCA / t-SNE
  15. 360路由器的虚拟服务器设置,360路由器无线万能中继设置教程图解
  16. Python数学问题17:鸡兔同笼问题
  17. 弘辽科技:拼多多活动价格建议价格太低了怎么办?
  18. 云波社区 l Mecha Morphing(变形机甲)游戏介绍
  19. 直流伺服支持绝对值编码器SSI,SPI低压大电流伺服AGV驱动器外骨骼驱动机器人关节驱动智能直流伺服小体积大功率直流伺服
  20. word中每行的文字如何设置文字在当前行居中对齐

热门文章

  1. linux显卡透传,显卡虚拟化方案之GPU透传(二)理论基础篇
  2. python数据透视表怎么存下来_python-从存储在两个数据框中的两个数据透视表中减去值...
  3. 系统架构设计笔记(87)—— 计算机病毒与防治
  4. 谷歌中国学术搜索上线
  5. Oss头像上传报错:com.aliyun.oss.OSSException: The specified bucket is not valid.
  6. HTML网页设计期末课程大作业~旅游住宿酒店的HTML网页设计(14页) ~学生网页设计作业源码 旅游网页代码 学生网页设计与制作期末作业下载 DW旅游网页作业代码下载
  7. IEEE AJE期刊润色 流程记录
  8. 无线充qi v2.0认证的重磅消息,快来了解下~
  9. UC编程9-管道pipe操作和共享内存段shm操作
  10. 博士是什么(Matt Might) (科学网)