在我的反应式应用程序中,我的Publisher
很热,Subscriber
很慢。为了解决需求不足的问题,我使用了onBackpressureBuffer,但是可能的溢出错误有点令人恐惧。
如何监视Flux.onBackpressureBuffer(maxSize)
创建的队列中存在的元素数量?最好使用内置反应堆metrics()
方法。如果有任何区别,我正在使用Spring Boot + Micrometer。
答案 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)
// ...
}