Reactor / RxJava从SQS读取时的背压如何

时间:2017-07-14 18:14:05

标签: rx-java project-reactor

我对整个反应范式都不熟悉,而且我试图了解从SQS这样的队列中读取时背压是如何工作的。

在Reactor中你有你的Flux和RxJava你在后台有你的Observable polling SQS,如:

while (true) {
   Future<ReceiveMessageResult> future = sqsClient.receiveMessageAsync(queueUrl);
   //emit or send to subscribers
}

假设您有一个下游组件需要进行速率受限的REST调用。你如何告诉轮询器由于速率限制而放慢速度,这样你就不会有大量的实时消息存在于具有OOM潜力的内存中?

1 个答案:

答案 0 :(得分:1)

在这种情况下,您需要使用Flowable。使用Flowable,订阅者可以在处理收到的下一批请求消息后,一次请求一定数量的消息。

参考:https://medium.com/@srinuraop/rxjava-backpressure-3376130e76c1

Flowable<Integer> observable = Flowable.range(1, 133);
 observable.subscribe(new DefaultSubscriber<Integer>() {
 @Override public void onStart() {
 request(1);
 }
 @Override public void onNext(Integer t) {
 LOGGER.info(“item “+t);
//this where you request message, in this case one message at time and after processing one message it will request for next one.
 request(1);
 }
 @Override public void onError(Throwable t) {
 LOGGER.info(“”+t);
 }
 @Override public void onComplete() {
 LOGGER.info(“complete”);
 }
 });