diff --git a/lambda-invoker/src/main/java/com/networknt/aws/lambda/LambdaFunctionHandler.java b/lambda-invoker/src/main/java/com/networknt/aws/lambda/LambdaFunctionHandler.java index b2c7bac..8c1e597 100644 --- a/lambda-invoker/src/main/java/com/networknt/aws/lambda/LambdaFunctionHandler.java +++ b/lambda-invoker/src/main/java/com/networknt/aws/lambda/LambdaFunctionHandler.java @@ -2,7 +2,6 @@ import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent; import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent; -import com.networknt.body.BodyHandler; import com.networknt.config.Config; import com.networknt.config.JsonMapper; import com.networknt.handler.Handler; @@ -25,11 +24,7 @@ import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.lambda.LambdaAsyncClient; -import software.amazon.awssdk.services.lambda.LambdaClient; -import software.amazon.awssdk.services.lambda.LambdaClientBuilder; import software.amazon.awssdk.services.lambda.model.InvokeRequest; -import software.amazon.awssdk.services.lambda.model.InvokeResponse; -import software.amazon.awssdk.services.lambda.model.LambdaException; import java.net.URI; import java.time.Duration; @@ -54,6 +49,9 @@ public LambdaFunctionHandler() { .readTimeout(Duration.ofMillis(config.getApiCallAttemptTimeout())) .writeTimeout(Duration.ofMillis(config.getApiCallAttemptTimeout())) .connectionTimeout(Duration.ofMillis(config.getApiCallAttemptTimeout())) + .maxConcurrency(config.getMaxConcurrency()) + .maxPendingConnectionAcquires(config.getMaxPendingConnectionAcquires()) + .connectionAcquisitionTimeout(Duration.ofSeconds(config.getConnectionAcquisitionTimeout())) .build(); ClientOverrideConfiguration overrideConfig = ClientOverrideConfiguration.builder() .apiCallTimeout(Duration.ofMillis(config.getApiCallTimeout())) diff --git a/lambda-invoker/src/main/java/com/networknt/aws/lambda/LambdaInvokerConfig.java b/lambda-invoker/src/main/java/com/networknt/aws/lambda/LambdaInvokerConfig.java index a588630..92a6640 100644 --- a/lambda-invoker/src/main/java/com/networknt/aws/lambda/LambdaInvokerConfig.java +++ b/lambda-invoker/src/main/java/com/networknt/aws/lambda/LambdaInvokerConfig.java @@ -22,6 +22,9 @@ public class LambdaInvokerConfig { private static final String FUNCTIONS = "functions"; private static final String METRICS_INJECTION = "metricsInjection"; private static final String METRICS_NAME = "metricsName"; + private static final String MAX_CONCURRENCY = "maxConcurrency"; + private static final String MAX_PENDING_CONNECTION_ACQUIRES = "maxPendingConnectionAcquires"; + private static final String CONNECTION_ACQUISITION_TIMEOUT = "connectionAcquisitionTimeout"; private String region; private String endpointOverride; @@ -31,6 +34,9 @@ public class LambdaInvokerConfig { private Map functions; private boolean metricsInjection; private String metricsName; + private int maxConcurrency; + private int maxPendingConnectionAcquires; + private int connectionAcquisitionTimeout; public String getRegion() { return region; @@ -96,6 +102,30 @@ public void setMetricsName(String metricsName) { this.metricsName = metricsName; } + public int getMaxConcurrency() { + return maxConcurrency; + } + + public void setMaxConcurrency(int maxConcurrency) { + this.maxConcurrency = maxConcurrency; + } + + public int getMaxPendingConnectionAcquires() { + return maxPendingConnectionAcquires; + } + + public void setMaxPendingConnectionAcquires(int maxPendingConnectionAcquires) { + this.maxPendingConnectionAcquires = maxPendingConnectionAcquires; + } + + public int getConnectionAcquisitionTimeout() { + return connectionAcquisitionTimeout; + } + + public void setConnectionAcquisitionTimeout(int connectionAcquisitionTimeout) { + this.connectionAcquisitionTimeout = connectionAcquisitionTimeout; + } + private final Config config; private Map mappedConfig; @@ -114,6 +144,7 @@ private LambdaInvokerConfig(String configName) { setConfigData(); setConfigMap(); } + public static LambdaInvokerConfig load() { return new LambdaInvokerConfig(); } @@ -127,6 +158,7 @@ void reload() { setConfigData(); setConfigMap(); } + public Map getMappedConfig() { return mappedConfig; } @@ -160,6 +192,18 @@ private void setConfigData() { if(object != null ) { metricsName = (String)object; } + object = mappedConfig.get(MAX_CONCURRENCY); + if (object != null) { + maxConcurrency = Config.loadIntegerValue(MAX_CONCURRENCY, object); + } + object = mappedConfig.get(MAX_PENDING_CONNECTION_ACQUIRES); + if (object != null) { + maxPendingConnectionAcquires = Config.loadIntegerValue(MAX_PENDING_CONNECTION_ACQUIRES, object); + } + object = mappedConfig.get(CONNECTION_ACQUISITION_TIMEOUT); + if (object != null) { + connectionAcquisitionTimeout = Config.loadIntegerValue(CONNECTION_ACQUISITION_TIMEOUT, object); + } } private void setConfigMap() { diff --git a/lambda-invoker/src/main/resources/config/lambda-invoker.yml b/lambda-invoker/src/main/resources/config/lambda-invoker.yml index e240623..85fcb45 100644 --- a/lambda-invoker/src/main/resources/config/lambda-invoker.yml +++ b/lambda-invoker/src/main/resources/config/lambda-invoker.yml @@ -7,6 +7,12 @@ endpointOverride: ${lambda-invoker.endpointOverride:} apiCallTimeout: ${lambda-invoker.apiCallTimeout:60000} # Api call attempt timeout in milliseconds. This sets the amount of time for each individual attempt. apiCallAttemptTimeout: ${lambda-invoker.apiCallAttemptTimeout:20000} +# The maximum number of concurrent requests that can be made to Lambda. Default is 50. +maxConcurrency: ${lambda-invoker.maxConcurrency:50} +# The maximum number of pending acquires allowed. Default is 10000. +maxPendingConnectionAcquires: ${lambda-invoker.maxPendingConnectionAcquires:10000} +# The amount of time to wait when acquiring a connection from the pool before timing out in seconds. Default is 10 seconds. +connectionAcquisitionTimeout: ${lambda-invoker.connectionAcquisitionTimeout:10} # The LogType of the execution log of Lambda. Set Tail to include and None to not include. logType: ${lambda-invoker.logType:Tail} # mapping of the endpoints to Lambda functions. Define a list of functions in values.yml file.