All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.netflix.concurrency.limits.limiter.AbstractLimiterBuilder Maven / Gradle / Ivy

package com.netflix.concurrency.limits.limiter;

import com.netflix.concurrency.limits.Limit;
import com.netflix.concurrency.limits.Limiter;
import com.netflix.concurrency.limits.Strategy;
import com.netflix.concurrency.limits.internal.Preconditions;
import com.netflix.concurrency.limits.limit.VegasLimit;
import com.netflix.concurrency.limits.strategy.LookupPartitionStrategy;
import com.netflix.concurrency.limits.strategy.LookupPartitionStrategy.Builder;
import com.netflix.concurrency.limits.strategy.SimpleStrategy;

import java.util.function.Consumer;
import java.util.function.Function;

/**
 * Base class through which an RPC specific limiter may be constructed
 *
 * @param  Concrete builder type specific to an RPC mechanism
 * @param  Type capturing the context of a request for the concrete RPC mechanism
 */
public abstract class AbstractLimiterBuilder, ContextT> {
    protected Strategy strategy;
    protected Builder builder;
    private DefaultLimiter.Builder limiterBuilder = DefaultLimiter.newBuilder();
    
    /**
     * Configure the strategy for partitioning the limit.  
     * @param contextToGroup Mapper from the context to a name group associated with a percentage of the limit
     * @param configurer Function through which the value set support by the func may be assigned
     *                   a percentage of the limit
     * @return Chainable builder
     */
    public BuilderT partitionByLookup(
            Function contextToGroup, 
            Consumer> configurer) {
        Preconditions.checkState(this.strategy == null && this.builder == null, "strategy already set");
        
        builder = LookupPartitionStrategy.newBuilder(contextToGroup);
        configurer.accept(builder);
        return self();
    }
    
    /**
     * Strategy for acquiring a token from the limiter based on the context.
     * @param strategy
     * @return Chainable builder
     */
    public BuilderT strategy(Strategy strategy) {
        Preconditions.checkState(this.strategy == null && this.builder == null, "strategy already set");
        
        this.strategy = strategy;
        return self();
    }
    
    /**
     * Set the limit algorithm to use.  Default is {@link VegasLimit}
     * @param limit Limit algorithm to use
     * @return Chainable builder
     * @deprecated Use {@link AbstractLimiterBuilder#limiter(Consumer)}
     */
    @Deprecated
    public BuilderT limit(Limit limit) {
        return limiter(builder -> builder.limit(limit));
    }
    
    public BuilderT limiter(Consumer consumer) {
        consumer.accept(this.limiterBuilder);
        return self();
    }
    
    protected Limiter buildLimiter() {
        return limiterBuilder.build(getFinalStrategy());
    }
    
    private Strategy getFinalStrategy() {
        if (builder != null) {
            return builder.build();
        } else if (strategy != null) {
            return strategy;
        } else {
            return new SimpleStrategy<>();
        }
    }

    protected abstract BuilderT self();
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy