使用Reactor Kafka时如何处理背压?

时间:2019-07-04 08:53:30

标签: reactive-programming kafka-consumer-api project-reactor

我正在使用Reactor Kafka来消费和产生Kafka事件。在消费事件中,我的消费者很慢,因此我需要应对背压。

但是,我发现无论用什么叫Subscription.request(),发布者都会立即发布该主题的所有事件,从而使消费者不知所措。

我正在使用自定义订阅服务器,当我订阅KafkaReceiver.receive()时,可以通过调用Subscription.request()设置少量初始请求。据我了解,这就是我告诉发布者我的消费者最初想要多少个事件。

我的订户:

public class KafkaEventSubscriber extends BaseSubscriber {
private final int numberOfItemsToRequestOnSubscribe;
private final int numberOfItemsToRequestOnNext;

public KafkaEventSubscriber(int numberOfItemsToRequestOnSubscribe,
                             int numberOfItemsToRequestOnNext) {
    this.numberOfItemsToRequestOnSubscribe = numberOfItemsToRequestOnSubscribe;
    this.numberOfItemsToRequestOnNext = numberOfItemsToRequestOnNext;
}

@Override
protected void hookOnSubscribe(Subscription subscription) {
    subscription.request(numberOfItemsToRequestOnSubscribe);
}

@Override
protected void hookOnNext(EnrichedMetadata value) {
    request(numberOfItemsToRequestOnNext);
}
}

我如何使用订户:

kafkaReceiver.receive().map(ReceiverRecord::value).map(KafkaConsumer::acknowledge).subscribe(new KafkaEventSubscriber(10, 1));

我希望在对订户的onNext()方法进行任何调用之前,KafkaReceiver会输出10个事件,但是KafkaReceiver会输出尚未从该主题进行ACK:ed的所有事件。

我体验到,无论我们使用什么Subscription.request()进行发布,发布者都会立即发布该主题的所有事件,而不尊重我一直在采取的反压措施。

0 个答案:

没有答案