For a high-throughput scenario, it may make sense to process only a fraction of events by applying the sampling technique. Reactor allows us to do so with the sample and sampleTimeout operators. So, a sequence may periodically emit an item corresponding to the most recently seen value within a time window. Let's assume the following code:
Flux.range(1, 100)
.delayElements(Duration.ofMillis(1))
.sample(Duration.ofMillis(20))
.subscribe(e -> log.info("onNext: {}", e));
The preceding code generates the following output:
onNext: 13
onNext: 28
onNext: 43
onNext: 58
onNext: 73
onNext: 89
onNext: 100
The preceding log shows that, even though we generate items sequentially every millisecond, the subscriber receives only a fraction of events within the desired limit. Through this approach, we may use passive rate limiting in cases where we do not need all incoming events for successful operation.