我对整个反应范式都不熟悉,而且我试图了解从SQS这样的队列中读取时背压是如何工作的。
在Reactor中你有你的Flux和RxJava你在后台有你的Observable polling SQS,如:
while (true) {
Future<ReceiveMessageResult> future = sqsClient.receiveMessageAsync(queueUrl);
//emit or send to subscribers
}
假设您有一个下游组件需要进行速率受限的REST调用。你如何告诉轮询器由于速率限制而放慢速度,这样你就不会有大量的实时消息存在于具有OOM潜力的内存中?
答案 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”);
}
});