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

software.amazon.kinesis.leases.LeaseManagementConfig Maven / Gradle / Ivy

Go to download

The Amazon Kinesis Client Library for Java enables Java developers to easily consume and process data from Amazon Kinesis.

There is a newer version: 3.0.1
Show newest version
/*
 *  Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 *
 *  Licensed under the Amazon Software License (the "License").
 *  You may not use this file except in compliance with the License.
 *  A copy of the License is located at
 *
 *  http://aws.amazon.com/asl/
 *
 *  or in the "license" file accompanying this file. This file is distributed
 *  on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 *  express or implied. See the License for the specific language governing
 *  permissions and limitations under the License. 
 */

package software.amazon.kinesis.leases;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import com.google.common.util.concurrent.ThreadFactoryBuilder;

import lombok.Data;
import lombok.NonNull;
import lombok.experimental.Accessors;
import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient;
import software.amazon.awssdk.services.kinesis.KinesisAsyncClient;
import software.amazon.kinesis.common.InitialPositionInStream;
import software.amazon.kinesis.common.InitialPositionInStreamExtended;
import software.amazon.kinesis.leases.dynamodb.DynamoDBLeaseManagementFactory;
import software.amazon.kinesis.metrics.MetricsFactory;
import software.amazon.kinesis.metrics.NullMetricsFactory;

/**
 * Used by the KCL to configure lease management.
 */
@Data
@Accessors(fluent = true)
public class LeaseManagementConfig {
    /**
     * Name of the table to use in DynamoDB
     *
     * @return String
     */
    @NonNull
    private final String tableName;
    /**
     * Client to be used to access DynamoDB service.
     *
     * @return {@link DynamoDbAsyncClient}
     */
    @NonNull
    private final DynamoDbAsyncClient dynamoDBClient;
    /**
     * Client to be used to access Kinesis Data Streams service.
     *
     * @return {@link KinesisAsyncClient}
     */
    @NonNull
    private final KinesisAsyncClient kinesisClient;
    /**
     * Name of the Kinesis Data Stream to read records from.
     */
    @NonNull
    private final String streamName;
    /**
     * Used to distinguish different workers/processes of a KCL application.
     *
     * @return String
     */
    @NonNull
    private final String workerIdentifier;

    /**
     * Fail over time in milliseconds. A worker which does not renew it's lease within this time interval
     * will be regarded as having problems and it's shards will be assigned to other workers.
     * For applications that have a large number of shards, this may be set to a higher number to reduce
     * the number of DynamoDB IOPS required for tracking leases.
     *
     * 

Default value: 10000L

*/ private long failoverTimeMillis = 10000L; /** * Shard sync interval in milliseconds - e.g. wait for this long between shard sync tasks. * *

Default value: 60000L

*/ private long shardSyncIntervalMillis = 60000L; /** * Cleanup leases upon shards completion (don't wait until they expire in Kinesis). * Keeping leases takes some tracking/resources (e.g. they need to be renewed, assigned), so by default we try * to delete the ones we don't need any longer. * *

Default value: true

*/ private boolean cleanupLeasesUponShardCompletion = true; /** * The max number of leases (shards) this worker should process. * This can be useful to avoid overloading (and thrashing) a worker when a host has resource constraints * or during deployment. * *

NOTE: Setting this to a low value can cause data loss if workers are not able to pick up all shards in the * stream due to the max limit.

* *

Default value: {@link Integer#MAX_VALUE}

*/ private int maxLeasesForWorker = Integer.MAX_VALUE;; /** * Max leases to steal from another worker at one time (for load balancing). * Setting this to a higher number can allow for faster load convergence (e.g. during deployments, cold starts), * but can cause higher churn in the system. * *

Default value: 1

*/ private int maxLeasesToStealAtOneTime = 1; /** * The Amazon DynamoDB table used for tracking leases will be provisioned with this read capacity. * *

Default value: 10

*/ private int initialLeaseTableReadCapacity = 10; /** * The Amazon DynamoDB table used for tracking leases will be provisioned with this write capacity. * *

Default value: 10

*/ private int initialLeaseTableWriteCapacity = 10; /** * The size of the thread pool to create for the lease renewer to use. * *

Default value: 20

*/ private int maxLeaseRenewalThreads = 20; /** * */ private boolean ignoreUnexpectedChildShards = false; /** * */ private boolean consistentReads = false; private long listShardsBackoffTimeInMillis = 1500L; private int maxListShardsRetryAttempts = 50; public long epsilonMillis = 25L; /** * The initial position for getting records from Kinesis streams. * *

Default value: {@link InitialPositionInStream#TRIM_HORIZON}

*/ private InitialPositionInStreamExtended initialPositionInStream = InitialPositionInStreamExtended.newInitialPosition(InitialPositionInStream.TRIM_HORIZON); private int maxCacheMissesBeforeReload = 1000; private long listShardsCacheAllowedAgeInSeconds = 30; private int cacheMissWarningModulus = 250; private MetricsFactory metricsFactory = new NullMetricsFactory(); /** * Returns the metrics factory. * *

* NOTE: This method is deprecated and will be removed in a future release. This metrics factory is not being used * in the KCL. *

* * @return */ @Deprecated public MetricsFactory metricsFactory() { return metricsFactory; } /** * Sets the metrics factory. * *

* NOTE: This method is deprecated and will be removed in a future release. This metrics factory is not being used * in the KCL. *

* * @param metricsFactory */ @Deprecated public LeaseManagementConfig metricsFactory(final MetricsFactory metricsFactory) { this.metricsFactory = metricsFactory; return this; } /** * The {@link ExecutorService} to be used by {@link ShardSyncTaskManager}. * *

Default value: {@link LeaseManagementThreadPool}

*/ private ExecutorService executorService = new LeaseManagementThreadPool( new ThreadFactoryBuilder().setNameFormat("ShardSyncTaskManager-%04d").build()); static class LeaseManagementThreadPool extends ThreadPoolExecutor { private static final long DEFAULT_KEEP_ALIVE_TIME = 60L; LeaseManagementThreadPool(ThreadFactory threadFactory) { super(0, Integer.MAX_VALUE, DEFAULT_KEEP_ALIVE_TIME, TimeUnit.SECONDS, new SynchronousQueue<>(), threadFactory); } }; private LeaseManagementFactory leaseManagementFactory; public LeaseManagementFactory leaseManagementFactory() { if (leaseManagementFactory == null) { leaseManagementFactory = new DynamoDBLeaseManagementFactory(kinesisClient(), streamName(), dynamoDBClient(), tableName(), workerIdentifier(), executorService(), initialPositionInStream(), failoverTimeMillis(), epsilonMillis(), maxLeasesForWorker(), maxLeasesToStealAtOneTime(), maxLeaseRenewalThreads(), cleanupLeasesUponShardCompletion(), ignoreUnexpectedChildShards(), shardSyncIntervalMillis(), consistentReads(), listShardsBackoffTimeInMillis(), maxListShardsRetryAttempts(), maxCacheMissesBeforeReload(), listShardsCacheAllowedAgeInSeconds(), cacheMissWarningModulus(), initialLeaseTableReadCapacity(), initialLeaseTableWriteCapacity()); } return leaseManagementFactory; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy