所谓的背压就是反压(backpressure)

什么是背压问题

流系统中消息的处理速度跟不上消息的发送速度,导致消息的堆积。如果系统能感知消息堆积,并调整消息发送的速度。 使消息的处理速度和发送速度相协调就是有背压感知的系统。背压如果不能得到正确地处理,可能会导致资源被耗尽或者 甚至出现更糟的情况导致数据丢失。flink就是一个有背压感知的基于流的分布式消息处理系统。

举例说明: 1.正常情况:消息处理速度>=消息的发送速度,不发生消息拥堵,系统运行流畅

 2.异常情况:消息处理速度< 消息的发送速度,发生了消息拥堵,系统运行不畅。

消息拥堵可以采取两种方案 a.将拥堵的消息直接删除,将会导致数据丢失,在精确到要求高的场景非常不合适 b.将拥堵的消息缓存起来,并告知消息发送者减缓消息发送的速度。 3.处理方法:将缓冲区持久化,以方便在处理失败的情况下进行数据重放。 有些source本身提供持久化保证,可以优先考虑。例如: Apache Kafka是一个很不错的选择,可以背压从sink到source 的整个pipeline,同时对source进行限流来适配整个pipeline中最慢组件的速度,从而获得系统的稳定状态。

flink中的背压

Flink使用分布式阻塞队列来作为有界缓冲区。如同Java里通用的阻塞队列跟处理线程进行连接一样,一旦队列达到容量上限, 一个相对较慢的接受者将拖慢发送者。 举例说明: 图中有一个简单的flow,它由两个task组成

1、记录“A”进入Flink,然后被Task 1处理

2、Task 1处理后的结果被序列化进缓冲区

3、task 2从缓冲区内读取一些数据,缓冲区内将有更多的空间。

4、如果task 2处理的较慢,task1的缓存区将很快填满。发送速度随之下降。 注意:为了记录能被Flink处理,缓冲区必须是可用的

flink背压的两种场景

1.本地传输

如果task1和task2都运行在同一个工作节点(TaskManager),缓冲区可以被直接共享给下一个task,一旦task 2消费了数据它会 被回收。如果task 2比task 1慢,buffer会以比task 1填充的速度更慢的速度进行回收从而迫使task降速。

2.网络传输

如果task 1和task 2运行在不同的工作节点上。一旦缓冲区内的数据被发送出去(TCP Channel),它就会被回收。在接收端,数据被 拷贝到输入缓冲池的缓冲区中,如果没有缓冲区可用,从TCP连接中的数据读取动作将会被中断。输出端通常以watermark机制来保证不 会有太多的数据在传输途中。如果有足够的数据已经进入可发送状态,会等到情况稳定到阈值以下才会进行发送。这可以保证没有太多的 数据在路上。如果新的数据在消费端没有被消费(因为没有可用的缓冲区),这种情况会降低发送者发送数据的速度。

flink背压的性能测试

下面这张图显示了:随着时间的改变,生产者(黄色线)和消费者(绿色线)基于所达到的最大吞吐(在单一JVM中每秒达到8百万条记录) 的平均吞吐百分比。我们通过衡量task每5秒钟处理的记录数来衡量平均吞吐。

首先,我们运行生产者task到它最大生产速度的60%(我们通过Thread.sleep()来模拟降速)。消费者以同样的速度处理数据。 然后,我们将消费task的速度降至其最高速度的30%。你就会看到背压问题产生了,正如我们所见,生产者的速度也自然降至其最高速度的30%。

接着,我们对消费者停止人为降速,之后生产者和消费者task都达到了其最大的吞吐。接下来,我们再次将消费者的速度降至30%,pipeline给出了立即响应:生产者的速度也被自动降至30%。

最后,我们再次停止限速,两个task也再次恢复100%的速度。这所有的迹象表明:生产者和消费者在pipeline中的处理都在跟随彼此的吞吐而进行适当的调整,这就是我们在流pipeline中描述的行为。

flink背压的总结

Flink与持久化的source(例如kafka),能够为你提供即时的背压处理,而无需担心数据丢失。Flink不需要一个特殊的机制来处理背压, 因为Flink中的数据传输相当于已经提供了应对背压的机制。因此,Flink所获得的最大吞吐量由其pipeline中最慢的部件决定。

上述内容转载自[1],扯白了就是Flink自带的队列扛不住了。

Reference:

[0]《flink中的背压的处理原理》

[1]Flink如何应对背压问题

[2]How Apache Flink™ handles backpressure

[3]flink的背压问题产生原因和解决方法

[4]Flink 背压问题排查的梳理

[5]Flink :网络流控及反压剖析

flink背压问题处理(还没弄完)相关推荐

  1. stateful function用法记录(还没弄完)

    Reference: [1]https://ci.apache.org/projects/flink/flink-docs-release-1.8/dev/stream/state/state.htm ...

  2. hbase异步客户端连接-非阻塞并发模式实验记录(还没弄完)

    happybase使用thrift协议是阻塞的. 在网上无意间看到这句话,我有点慌了, 开玩笑,阻塞的怎么弄并发....... 不停谷歌之后,发现了aiohappybase这个东东,下面来使用并且压测 ...

  3. flink-faker用法示例(还没弄完,到时候再说)

    本文针对的是flink-faker这个连接器 https://github.com/knaufk/flink-faker 下面的使用案例来自ververica的flink-sql-cookbook 数 ...

  4. linux下面的安卓模拟器genymotion运行taptap游戏-还没弄完

    环境: ubuntu20.04 安装办法: chmod u+x genymotion-3.1.2-linux_x64.bin ./genymotion-3.1.2-linux_x64.bin 依赖vi ...

  5. 基于神经网络模型的文本语义通顺度计算研究-全文复现(还没弄完)

    该硕士学位论文分为两个部分: ①基于依存句法分析的语义通顺度计算方法 ②基于神经网络模型的语义通顺度计算方法 本篇记录摘抄了该论文的核心内容以及实验复现的详细步骤. 在N-gram模型下进行智能批改场 ...

  6. CapcityScheduler配置方法(还没弄完)

    Capacity Scheduler可以在 master:8088/cluster/scheduler中看到: 根据[1]中的说法,是多人共享集群或者提交多个任务到集群才用到的. Reference: ...

  7. Google Drive的linux客户端使用(还没弄完)

    Ubuntu19.10 grive现在被谷歌判定为是没有认证的应用,所以不行 试了insync,安装后,无法添加google账户,即使范强也不行. GoSync需要安装wxPython,无法成功 ht ...

  8. 「屋漏偏逢连夜雨」,Log4j 漏洞还没忙完,新的又来了

    整理 | 郑丽媛.禾木木 出品 | CSDN 这几天,Apache Log4j 2 绝对是众多 Java 程序员提到的高频词之一:由于 Apache Log4j 2 引发的严重安全漏洞,令一大批安全人 ...

  9. flink批流统一​(还没完成)

    flink批流统一​(还没完成) 从目前接触的资料来看, 批流一体化涉及的意思有这么几种: ①存储流批一体 ②数据流批一体 ③APi流批一体

最新文章

  1. PXE安装CentOS
  2. StringBuilder StringBuffer
  3. 机器学习系列之神经网络入门基础知识
  4. nyoj 211 (Floyd算法求传递闭包)
  5. 智源-计算所虚假新闻检测大赛 | 探秘假新闻中的视觉信息
  6. Spring MVC:表单处理卷。 1个
  7. amd为什么还用针脚_英特尔的针脚都取消了,为什么AMD的还没动静?
  8. 烤烟发病叶片高光谱特征分析
  9. Session过期,跳出iframe框架页显示会话过期页面
  10. USACO 4.2 The Perfect Stall 完美的牛栏(最大匹配)
  11. android进程通信6,[Android]你不知道的Android进程化(6)--进程通信Andromeda框架
  12. 二叉树、满二叉树、完全二叉树、平衡二叉树、二叉排序树、线索二叉树
  13. Linux应用编程之截断文件
  14. 门限签名(1)——秘密共享
  15. __builtin_ffs 的使用方法
  16. Huffman编码、Shannon编码、Fano编码——《小王子》文本压缩与解压
  17. 爱奇艺发布iQUT未来影院,移动观影千亿新市场初露端倪
  18. nbu Linux 邮件告警,NBU常用命令1——介质管理
  19. Windows 更新安装更新时,可能会收到“更新失败。安装一些更新时出现问题,且错误为:0x80073701,0x800f0988解决方案
  20. Git中文化 ,Git GUI Here汉化

热门文章

  1. C#远程调用技术WebService葵花宝典
  2. 每日一句(2014-9-22)
  3. [转]计算机视觉领域稍微容易中的期刊(第一版)
  4. CSS之简单的双引号
  5. C#之委托的个人理解
  6. vue项目的一些需要注意到的细节
  7. mysql连接报错:Unknown system variable ‘query_cache_size‘
  8. vue项目使用mint-ui库
  9. js常用reduce方法
  10. JavaScript垃圾回收机制理解