如何监视Flux.onBackpressureBuffer()队列大小

时间:2019-12-24 00:15:39

标签: project-reactor

在我的反应式应用程序中,我的Publisher很热,Subscriber很慢。为了解决需求不足的问题,我使用了onBackpressureBuffer,但是可能的溢出错误有点令人恐惧。

如何监视Flux.onBackpressureBuffer(maxSize)创建的队列中存在的元素数量?最好使用内置反应堆metrics()方法。如果有任何区别,我正在使用Spring Boot + Micrometer。

1 个答案:

答案 0 :(得分:1)

尽管我们没有在Reactor中找到一种简单的方法,但是我们发现了一个“ hacky”的方法。这里是:https://github.com/allegro/envoy-control/blob/master/envoy-control-core/src/main/kotlin/pl/allegro/tech/servicemesh/envoycontrol/utils/ReactorUtils.kt#L34

此功能测量各种Flux运算符的缓冲区大小。不能保证可以在所有运算符上使用它,但是已在onBackpressureBuffer上对其进行了测试,并获得了肯定的结果。 它是用Kotlin编写的,但是将其移植到Java应该非常容易。

onBackpressureBuffer情况下,此代码的本质是将Subscription强制转换为Scannable,然后使用BUFFERED属性:

flux
  .onBackressureBuffer(maxSize)
  .doOnSubscribe { subscription -> 
     // ...
     val queueSize = Scannable.from(subscription).scan(Scannable.Attr.BUFFERED)
     // ...
  }