Skip to content

Commit 716eb0d

Browse files
committed
docs
1 parent 36b36f9 commit 716eb0d

File tree

7 files changed

+38
-17
lines changed

7 files changed

+38
-17
lines changed

docs/documentation/features.md

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,30 @@ intersections:
324324
will still happen, but won't reset the retry, will be still marked as the last attempt in the retry info. The point
325325
(1) still holds, but in case of an error, no retry will happen.
326326

327-
## Rate Limiting Reconciliation
327+
## Rate Limiting
328+
329+
It is possible to rate limit reconciliation for a resource. Thus rate limiting is per resource,
330+
and it takes precedence over retry and re-schedule configurations. So for example event a retry is scheduled in
331+
1 seconds but this does not meet the rate limit, the next reconciliation will be postponed according rate limiting rules;
332+
however never cancelled, just executed as early as possible according rate limit configuration.
333+
334+
Rate limiting is by default turned off, since correct configuration depends on the reconciler implementation, and
335+
how long an execution takes.
336+
(The parallelism of reconciliation itself can be limited [`ConfigurationService`](https://github.com/java-operator-sdk/java-operator-sdk/blob/ce4d996ee073ebef5715737995fc3d33f4751275/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationService.java#L120-L120)
337+
by setting appropriate ExecutorService.)
338+
339+
A default implementation of rate limiter is provided, see: [`PeriodRateLimiter`](https://github.com/java-operator-sdk/java-operator-sdk/blob/ce4d996ee073ebef5715737995fc3d33f4751275/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/rate/PeriodRateLimiter.java#L14-L14).
340+
Users can override it with a custom implementation of
341+
[`RateLimiter`](https://github.com/java-operator-sdk/java-operator-sdk/blob/ce4d996ee073ebef5715737995fc3d33f4751275/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/rate/RateLimiter.java)
342+
interface.
343+
344+
To configure the default rate limiter use `@ControllerConfiguration` annotation. The following configuration limits
345+
the reconciliation to 2 in 3 seconds:
346+
347+
`@ControllerConfiguration(rateLimit = @RateLimit(limitForPeriod = 2,refreshPeriod = 3,refreshPeriodTimeUnit = TimeUnit.SECONDS))`.
348+
349+
That means if the reconciler executed twice in one second, it will wait at least additional two seconds before it is
350+
reconciled again.
328351

329352

330353
## Handling Related Events with Event Sources

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/AnnotationControllerConfiguration.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -148,10 +148,10 @@ public Optional<Duration> reconciliationMaxInterval() {
148148

149149
@Override
150150
public RateLimiter getRateLimiter() {
151-
if (annotation.rateLimiter() != null) {
152-
return new PeriodRateLimiter(Duration.of(annotation.rateLimiter().refreshPeriod(),
153-
annotation.rateLimiter().refreshPeriodTimeUnit().toChronoUnit()),
154-
annotation.rateLimiter().limitForPeriod());
151+
if (annotation.rateLimit() != null) {
152+
return new PeriodRateLimiter(Duration.of(annotation.rateLimit().refreshPeriod(),
153+
annotation.rateLimit().refreshPeriodTimeUnit().toChronoUnit()),
154+
annotation.rateLimit().limitForPeriod());
155155
} else {
156156
return io.javaoperatorsdk.operator.api.config.ControllerConfiguration.super.getRateLimiter();
157157
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ControllerConfiguration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ ReconciliationMaxInterval reconciliationMaxInterval() default @ReconciliationMax
7070
interval = 10);
7171

7272

73-
RateLimiter rateLimiter() default @RateLimiter;
73+
RateLimit rateLimit() default @RateLimit;
7474

7575
/**
7676
* Optional list of {@link Dependent} configurations which associate a resource type to a

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/RateLimiter.java renamed to operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/RateLimit.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
@Retention(RetentionPolicy.RUNTIME)
1212
@Target({ElementType.TYPE})
13-
public @interface RateLimiter {
13+
public @interface RateLimit {
1414

1515
int limitForPeriod() default PeriodRateLimiter.NO_LIMIT_PERIOD;
1616

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/rate/RateLimiter.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ public interface RateLimiter {
1414
*/
1515
Optional<Duration> acquirePermission(ResourceID resourceID);
1616

17+
/**
18+
* Cleanup state. Called when resource is deleted.
19+
*/
1720
void clear(ResourceID resourceID);
1821

1922
}

operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/ratelimit/RateLimitReconciler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import io.javaoperatorsdk.operator.api.reconciler.*;
77

8-
@ControllerConfiguration(rateLimiter = @RateLimiter(limitForPeriod = 1,
8+
@ControllerConfiguration(rateLimit = @RateLimit(limitForPeriod = 1,
99
refreshPeriod = RateLimitReconciler.REFRESH_PERIOD,
1010
refreshPeriodTimeUnit = TimeUnit.MILLISECONDS))
1111
public class RateLimitReconciler

sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageReconciler.java

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.util.HashMap;
44
import java.util.Map;
55
import java.util.Objects;
6+
import java.util.concurrent.TimeUnit;
67

78
import org.apache.commons.lang3.StringUtils;
89
import org.slf4j.Logger;
@@ -18,22 +19,16 @@
1819
import io.fabric8.kubernetes.client.KubernetesClient;
1920
import io.javaoperatorsdk.operator.ReconcilerUtils;
2021
import io.javaoperatorsdk.operator.api.config.informer.InformerConfiguration;
21-
import io.javaoperatorsdk.operator.api.reconciler.Context;
22-
import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration;
23-
import io.javaoperatorsdk.operator.api.reconciler.ErrorStatusHandler;
24-
import io.javaoperatorsdk.operator.api.reconciler.ErrorStatusUpdateControl;
25-
import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext;
26-
import io.javaoperatorsdk.operator.api.reconciler.EventSourceInitializer;
27-
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
28-
import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
22+
import io.javaoperatorsdk.operator.api.reconciler.*;
2923
import io.javaoperatorsdk.operator.processing.event.source.EventSource;
3024
import io.javaoperatorsdk.operator.processing.event.source.informer.InformerEventSource;
3125

3226
import static io.javaoperatorsdk.operator.sample.Utils.*;
3327
import static io.javaoperatorsdk.operator.sample.WebPageManagedDependentsReconciler.SELECTOR;
3428

3529
/** Shows how to implement reconciler using the low level api directly. */
36-
@ControllerConfiguration
30+
@ControllerConfiguration(rateLimit = @RateLimit(limitForPeriod = 2, refreshPeriod = 3,
31+
refreshPeriodTimeUnit = TimeUnit.SECONDS))
3732
public class WebPageReconciler
3833
implements Reconciler<WebPage>, ErrorStatusHandler<WebPage>, EventSourceInitializer<WebPage> {
3934

0 commit comments

Comments
 (0)