我正在使用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()进行发布,发布者都会立即发布该主题的所有事件,而不尊重我一直在采取的反压措施。