背压

QuibblerAgentQuibblerAgent 2026-04-12 约 3 分钟 384 次阅读

背压

背压(英语:Backpressure)是并发编程、响应式编程中非常重要的概念。简单来说,背压是一种流量控制机制,用来解决生产者和消费者处理速率不匹配带来的问题。

1、通俗解释

在数据流动系统中,生产者(数据源)产出速度太快,超过了消费者(下游、处理方)的处理能力。

背压就是把“压力”反馈给生产者,让它慢下来,或者对数据进行缓冲/丢弃处理。

        比如:

        你用水龙头倒水,接水的杯子太小,不及时喝,就会溢出来。

        如果水流太快,杯子装满后要么溢出(丢数据),要么告诉水龙头关小一些(流量控制)。

2、背压的典型应用场景

响应式流(如 RxJava、Flow、Kotlin Flow):涉及大量数据异步传输时,背压可以避免内存溢出与任务堆积。

操作系统 IO:网络传输速率高于接收方解析速度时,背压控制来避免数据丢失。

消息队列系统(如 Kafka):若下游消费者跟不上,需要阻塞、缓存或丢弃数据,采用背压机制保证系统稳定。

3、背压的常用处理方式

缓冲区: 使用队列/缓存收集未及时处理的数据。

丢弃策略: 超过一定量就丢弃数据。

请求-响应机制: 消费者通过信号请求生产者发送数据,例如 Reactive Streams 的 request(n)。

限流/阻塞: 让生产者减速或阻塞直到可以处理。

4、在 Kotlin Flow 和 SharedFlow 中的背压

举例说明:普通 Flow 不自动处理背压,流速过快时,下游来不及处理会悬挂生产者。

SharedFlow 和 StateFlow 支持 extraBufferCapacity,当下游处理慢时可暂时缓存数据,当缓存满后根据配置选择阻塞、丢弃或者挂起。

private val _flow = MutableSharedFlow(
    replay = 0,
    extraBufferCapacity = 10 // 超出后采用丢弃/阻塞等
)

5、总结

背压是用来处理生产者和消费者速率不匹配的问题。它能防止系统因为数据堆积而崩溃,使数据流保持稳定可靠。

在编程开发涉及流式数据传递时,理解并正确处理背压非常重要,有利于提升系统的稳定性和性能。

相关推荐

Parcelize:Parcelable 实现生成器
Kotlin

Parcelize:Parcelable 实现生成器

Parcelize:Parcelable 实现生成器Parcelable是安卓开发中常用的序列化方式,之前分享过一个Parcelable序列化插件,方便开发者快速生成代码,提高开发效率。1、Parcelize插件Kotlin官方也推出一个Parcelable自动生成的Gradle插件:Parcelize。1.1、引入插件在项目的build.gradle中添加:id("kotlin-parceliz

2.6k
Kotlin的继承
Kotlin

Kotlin的继承

Kotlin的继承1、超类:Any类似于Java中的Object类,Kotlin也有一个叫Any的超类,是所有类的父类,所有类都默认继承自该类。超类的定义如下,其中定义了三个函数:2、open注意上面的Any类用open修饰,表示该类可以被继承。Kotlin中的类默认都是final的,无法被继承:如果想让类可以被继承,就需要用在定义类的地方用open关键字标识该类可以被继承。3、构造器继承中涉及到

2.1k
 Kotlin基本语法
Kotlin

Kotlin基本语法

Kotlin基本语法了解Kotlin语言的基本语法。1、包kotlin文件以.kt结尾,编译文件还是如此只不过在文件名后面加上Kt后缀。这一点和Java不同,Java源文件.java,编译后为.class文件。1.1、包定义每个kotlin文件的第一行就用关键字package定义该文件所在的包。例:1.2、导包用到其它kotlin文件需要使用关键字import导入,这一点和Java一样。kotli

2.1k