可观察的发射器为HystrixCommands产生太大的压力

时间:2018-02-16 10:20:41

标签: java-8 rx-java observable hystrix

我有一个Observable可以发出文件行(从GCS中读取许多GB)。

return StringObservable.byLine(
    Observable.using(
        () -> storage.get(blobId).reader(),
            reader -> Observable.create(
                    new OnSubscribeReadChannel(reader, 64 * 1024)
                ),
            ReadChannel::close
    )
)

每一行都会导致多个(在某些情况下很多)调用各种DB,所有这些都包含在Hystrix命令中。显然这些线最终压倒了Hystrix命令,电路开始打开,每个人都有糟糕的一天。

这正是我正在做的事情:

readLinesFromCloudStorageFile.readLines(blobInfo.getBlobId()))
            .map(this::deserializeLine)
            .flatMap(this::addDataToObjectFromSomeDb)
            .flatMap(this::writeObj)
            .map(Set::size)
            .reduce(0, (a, b) -> a + b)
            .toBlocking().single()

有没有办法可以应用一些背压,或限制一次处理的线数?

1 个答案:

答案 0 :(得分:0)

您需要使用Emitter.BackpressureMode.BUFFER

BUFFER
Buffers (unbounded) all onNext calls until the downstream can consume them.

http://reactivex.io/RxJava/1.x/javadoc/index.html?rx/Emitter.BackpressureMode.html