Infinispan写入过快抛出MissingBackpressureException求助
解决Infinispan Write Behind模式下的MissingBackpressureException问题
问题描述
当写入速度达到每秒数百条记录时,系统大量抛出MissingBackpressureException,搜索引擎中找不到Infinispan与该异常相关的解决方案,求解决思路。
环境配置
- 测试版本:Infinispan 13、14
- 部署方式:Infinispan嵌入在Wildfly 26中
- 存储模式:jdbc-store采用Write Behind模式
- 已尝试多种jdbc-store配置,均无效
根异常信息
Caused by: io.reactivex.rxjava3.exceptions.MissingBackpressureException: 因缺少请求,无法发送新分组(#128)。请确保下游始终能接收新分组,且每个分组都按顺序被消费,这样整个操作符才能继续执行。 at io.reactivex.rxjava3.rxjava//io.reactivex.rxjava3.internal.operators.flowable.FlowableGroupBy$GroupBySubscriber.onNext(FlowableGroupBy.java:197) at io.reactivex.rxjava3.rxjava//io.reactivex.rxjava3.internal.operators.flowable.FlowableMap$MapSubscriber.onNext(FlowableMap.java:69) at io.reactivex.rxjava3.rxjava//io.reactivex.rxjava3.internal.operators.flowable.FlowableFilter$FilterSubscriber.tryOnNext(FlowableFilter.java:75) at io.reactivex.rxjava3.rxjava//io.reactivex.rxjava3.internal.operators.flowable.FlowableFilter$FilterSubscriber.onNext(FlowableFilter.java:53) at io.reactivex.rxjava3.rxjava//io.reactivex.rxjava3.internal.operators.flowable.FlowablePublish$PublishConnection.drain(FlowablePublish.java:312) at io.reactivex.rxjava3.rxjava//io.reactivex.rxjava3.internal.operators.flowable.FlowablePublish$PublishConnection.onSubscribe(FlowablePublish.java:208) at io.reactivex.rxjava3.rxjava//io.reactivex.rxjava3.internal.operators.flowable.FlowableFromIterable.subscribe(FlowableFromIterable.java:69) at io.reactivex.rxjava3.rxjava//io.reactivex.rxjava3.internal.operators.flowable.FlowableFromIterable.subscribeActual(FlowableFromIterable.java:47) at io.reactivex.rxjava3.rxjava//io.reactivex.rxjava3.core.Flowable.subscribe(Flowable.java:15917) at io.reactivex.rxjava3.rxjava//io.reactivex.rxjava3.core.Flowable.subscribe(Flowable.java:15863) at io.reactivex.rxjava3.rxjava//io.reactivex.rxjava3.internal.operators.flowable.FlowablePublish.connect(FlowablePublish.java:93) at io.reactivex.rxjava3.rxjava//io.reactivex.rxjava3.internal.operators.flowable.FlowableAutoConnect.subscribeActual(FlowableAutoConnect.java:50) at io.reactivex.rxjava3.rxjava//io.reactivex.rxjava3.core.Flowable.subscribe(Flowable.java:15917) at io.reactivex.rxjava3.rxjava//io.reactivex.rxjava3.internal.operators.flowable.FlowableFilter.subscribeActual(FlowableFilter.java:38) at io.reactivex.rxjava3.rxjava//io.reactivex.rxjava3.core.Flowable.subscribe(Flowable.java:15917) at io.reactivex.rxjava3.rxjava//io.reactivex.rxjava3.internal.operators.flowable.FlowableMap.subscribeActual(FlowableMap.java:38) at io.reactivex.rxjava3.rxjava//io.reactivex.rxjava3.core.Flowable.subscribe(Flowable.java:15917) at io.reactivex.rxjava3.rxjava//io.reactivex.rxjava3.internal.operators.flowable.FlowableGroupBy.subscribeActual(FlowableGroupBy.java:73) at io.reactivex.rxjava3.rxjava//io.reactivex.rxjava3.core.Flowable.subscribe(Flowable.java:15917) at io.reactivex.rxjava3.rxjava//io.reactivex.rxjava3.internal.operators.flowable.FlowableMap.subscribeActual(FlowableMap.java:38) at io.reactivex.rxjava3.rxjava//io.reactivex.rxjava3.core.Flowable.subscribe(Flowable.java:15917) at io.reactivex.rxjava3.rxjava//io.reactivex.rxjava3.internal.operators.flowable.FlowableFlatMap.subscribeActual(FlowableFlatMap.java:51) at io.reactivex.rxjava3.rxjava//io.reactivex.rxjava3.core.Flowable.subscribe(Flowable.java:15917) at io.reactivex.rxjava3.rxjava//io.reactivex.rxjava3.core.Flowable.subscribe(Flowable.java:15863) at io.reactivex.rxjava3.rxjava//io.reactivex.rxjava3.internal.operators.flowable.FlowableLastMaybe.subscribeActual(FlowableLastMaybe.java:39) at io.reactivex.rxjava3.rxjava//io.reactivex.rxjava3.core.Maybe.subscribe(Maybe.java:5375) at io.reactivex.rxjava3.rxjava//io.reactivex.rxjava3.core.Maybe.blockingSubscribe(Maybe.java:2989) at io.reactivex.rxjava3.rxjava//io.reactivex.rxjava3.core.Maybe.blockingSubscribe(Maybe.java:2960) at org.infinispan.persistence.jdbc@14.0.2.Final//org.infinispan.persistence.jdbc.common.sql.BaseTableOperations.batchUpdates(BaseTableOperations.java:202)
解决思路
1. 调整Write Behind批量参数
Write Behind模式下,过小的批量配置会导致频繁分组处理,触发背压。尝试:
- 增大
write-behind.batch-size(默认100,可尝试500或1000) - 调整
write-behind.flush-interval,设置合理的刷新间隔,减少批量触发频率
2. 优化JDBC连接池
数据库连接不足会拖慢下游处理速度,引发背压:
- 增大连接池
max-pool-size,确保有足够连接处理批量写入 - 调整
idle-timeout和validation-timeout,避免连接耗尽或失效
3. 调整RxJava背压策略
异常源于RxJava分组处理的下游消费速度不足,可通过Infinispan系统属性调整:
- 设置
infinispan.persistence.jdbc.rx.backpressure.buffer-size增大缓冲区 - 根据业务场景选择背压策略:
infinispan.persistence.jdbc.rx.backpressure.drop(丢数据)或infinispan.persistence.jdbc.rx.backpressure.latest(保留最新数据)
4. 升级Infinispan小版本
检查是否有针对该问题的补丁,升级到对应大版本的最新小版本(如14.0.7.Final),可能修复RxJava背压相关bug
5. 限流写入速度
业务允许的话,在写入Infinispan前添加限流逻辑,控制每秒写入量,避免超过JDBC Store处理能力
6. 优化数据库性能
数据库写入瓶颈会导致下游阻塞:
- 给表添加合适索引,避免写入锁表
- 开启数据库批量写入优化,调整事务隔离级别
- 排查数据库服务器CPU、内存、磁盘IO是否存在瓶颈
内容的提问来源于stack exchange,提问作者Seweryn Niemiec
相关产品推荐
相关产品推荐

