

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# KCL 1.x 和 2.x 信息
<a name="shared-throughput-kcl-consumers"></a>

**重要**  
Amazon Kinesis Client Library（KCL）版本 1.x 和 2.x 已过时。KCL 1.x 将于 2026 年 1 月 30 日 end-of-support上市。我们**强烈建议**您在 2026 年 1 月 30 日之前，将使用版本 1.x 的 KCL 应用程序迁移到最新的 KCL 版本。要查找最新的 KCL 版本，请访问上的 [Amazon Kinesis 客户端库页面](https://github.com/awslabs/amazon-kinesis-client)。 GitHub有关最新 KCL 版本的信息，请参阅[使用 Kinesis Client Library](kcl.md)。有关从 KCL 1.x 迁移到 KCL 3.x 的信息，请参阅[从 KCL 1.x 迁移到 KCL 3.x](kcl-migration-1-3.md)。

开发可以处理来自 KDS 数据流的数据的自定义消费端应用程序的一种方法，是使用 Kinesis Client Library（KCL）。

**Topics**
+ [关于 KCL（先前版本）](#shared-throughput-kcl-consumers-overview)
+ [KCL 先前版本](#shared-throughput-kcl-consumers-versions)
+ [KCL 概念（先前版本）](#shared-throughput-kcl-consumers-concepts)
+ [使用租约表跟踪 KCL 消费端应用程序处理的分片](#shared-throughput-kcl-consumers-leasetable)
+ [使用相同的适用于 Java 的 KCL 2.x 消费端应用程序处理多个数据流](#shared-throughput-kcl-multistream)
+ [将 KCL 与 AWS Glue 架构注册表一起使用](#shared-throughput-kcl-consumers-glue-schema-registry)

**注意**  
建议您根据使用场景将 KCL 1.x 和 KCL 2.x 升级到最新的 KCL 1.x 版本或 KCL 2.x 版本。KCL 1.x 和 KCL 2.x 会定期更新至最新版本，包括最新依赖项和安全补丁、错误修复以及向后兼容的新功能。有关更多信息，请参阅 [https://github.com/awslabs/amazon-kinesis-client/releases。](https://github.com/awslabs/amazon-kinesis-client/releases)

## 关于 KCL（先前版本）
<a name="shared-throughput-kcl-consumers-overview"></a>

KCL 通过处理许多与分布式计算相关的复杂任务，帮助您使用和处理 Kinesis 数据流中的数据。这些任务包括跨多个消费端应用程序实例的负载平衡、对消费端应用程序实例故障的响应、已处理记录的检查点操作以及对重新分片的反应。KCL 负责所有这些子任务，让您可以将精力集中在编写自定义记录处理逻辑上。

KCL 不同于中提供的 Kinesis Data APIs Streams。 AWS SDKsKinesis Data APIs Streams 可帮助您管理 Kinesis Data Streams 的许多方面，包括创建流、重新分片以及放置和获取记录。KCL 围绕这些子任务提供了一个抽象层，让您可以专注于消费端应用程序的自定义数据处理逻辑工作。有关 Kinesis Data Streams API 的信息，请参阅 [Amazon Kinesis API Reference](https://docs.aws.amazon.com/kinesis/latest/APIReference/Welcome.html)。

**重要**  
KCL 属于 Java 库，使用名为 MultiLangDaemon 的多语言接口提供对 Java 以外语言的支持。此进程守护程序基于 Java，当您使用 Java 以外的 KCL 语言时，该程序会在后台运行。例如，如果您安装适用于 Python 的 KCL 并完全使用 Python 编写使用者应用程序，则仍然需要在系统上安装 Java，这是因为。 MultiLangDaemon此外， MultiLangDaemon 还有一些您可能需要根据自己的用例自定义的默认设置，例如它所连接的 AWS 区域。有关 MultiLangDaemon on 的更多信息 GitHub，请参阅 [KCL MultiLangDaemon 项目](https://github.com/awslabs/amazon-kinesis-client/tree/v1.x/src/main/java/com/amazonaws/services/kinesis/multilang)。

KCL 充当记录处理逻辑和 Kinesis Data Streams 之间的中介。

## KCL 先前版本
<a name="shared-throughput-kcl-consumers-versions"></a>

目前，您可以使用以下任一支持的 KCL 版本来构建自定义消费端应用程序：
+ **KCL 1.x**

  有关更多信息，请参阅 [开发 KCL 1.x 消费端](developing-consumers-with-kcl.md)。
+ **KCL 2.x**

  有关更多信息，请参阅 [开发 KCL 2.x 消费端](developing-consumers-with-kcl-v2.md)。

您可以使用 KCL 1.x 或 KCL 2.x 来构建使用共享吞吐量的消费端应用程序。有关更多信息，请参阅 [使用 KCL 开发具有共享吞吐量的自定义消费端](custom-kcl-consumers.md)。

要构建使用专用吞吐量的消费端应用程序（增强型扇出消费端应用程序），只能使用 KCL 2.x。有关更多信息，请参阅 [开发具有专用吞吐量的增强扇出型消费端](enhanced-consumers.md)。

有关 KCL 1.x 和 KCL 2.x 之间差异的信息，以及如何从 KCL 1.x 迁移到 KCL 2.x 的说明，请参阅 [将消费端从 KCL 1.x 迁移到 KCL 2.x](kcl-migration.md)。

## KCL 概念（先前版本）
<a name="shared-throughput-kcl-consumers-concepts"></a>
+ **KCL 消费端应用程序** – 使用 KCL 自定义构建的应用程序，旨在读取和处理数据流中的记录。
+ **消费端应用程序实例** – KCL 消费端应用程序通常是分布式应用程序，即一个或多个应用程序实例同时运行，以便协调故障和以动态方式实现数据记录处理负载平衡。
+ **工作程序** – KCL 消费端应用程序实例用来开始处理数据的高级类。
**重要**  
每个 KCL 消费端应用程序实例都有一个工作程序。

  工作程序负责初始化和监督各种任务，包括同步分片和租约信息、跟踪分片分配以及处理来自分片的数据。工作程序向 KCL 提供使用者应用程序的配置信息，例如此 KCL 使用者应用程序要处理的数据记录的数据流的名称以及访问此数据流所需的 AWS 凭据。工作程序还会启动特定的 KCL 消费端应用程序实例，将数据记录从数据流传输到记录处理器。
**重要**  
在 KCL 1.x 中，这个类被称为**工作程序**。有关更多信息（这些是 Java KCL 存储库），请参阅 [https://github.com/awslabs/amazon-kinesis-client/blob/v1.x/src/main/java/com/amazonaws/services/kinesis/clientlibrary/lib/worker/Worker.](https://github.com/awslabs/amazon-kinesis-client/blob/v1.x/src/main/java/com/amazonaws/services/kinesis/clientlibrary/lib/worker/Worker.java) java。在 KCL 2.x 中，这个类被称为**计划程序**。KCL 2.x 中计划程序的用途与 KCL 1.x 中工作程序的用途相同。[有关 KCL 2.x 中调度器类的更多信息，请参见 https://github.com/awslabs/ amazon-kinesis-client /.java。blob/master/amazon-kinesis-client/src/main/java/software/amazon/kinesis/coordinator/Scheduler](https://github.com/awslabs/amazon-kinesis-client/blob/master/amazon-kinesis-client/src/main/java/software/amazon/kinesis/coordinator/Scheduler.java)
+ **租约** – 定义工作程序和分片之间绑定的数据。分布式 KCL 消费端应用程序使用租约在一组工作程序中对数据记录进行分区。在任何指定时间，每个数据记录分片都通过由 **leaseKey** 变量标识的租约绑定到特定的工作程序。

  默认情况下，工作人员可以同时持有一份或多份租约（以 **maxLeasesForWorker** 变量的值为准）。
**重要**  
每个工作程序都将争相持有数据流中所有可用分片的所有可用租约。但是，无论何时，只有一个工作程序可以成功持有每份租约。

  例如，如果您的消费端应用程序实例 A 和工作程序 A 正在处理包含 4 个分片的数据流，则工作程序 A 可以同时持有分片 1、2、3 和 4 的租约。但是，如果您有 A 和 B 两个消费端应用程序实例，以及工作程序 A 和工作程序 B，并且这些实例正在处理包含 4 个分片的数据流，则工作程序 A 和工作程序 B 不能同时持有分片 1 的租约。一个工作程序持有特定分片的租约，直到该工作程序准备好停止处理该分片的数据记录或该工作程序失败为止。当一个工作程序停止持有租约时，另一个工作程序会接管并持有租约。

  有关更多信息（这些是 Java KCL 存储库），请参阅 KCL 1.x 的 [https://github.com/awslabs/amazon-kinesis-client/blob/v1.x/src/main/java/com/amazonaws/services/kinesis/leases/impl/Lease.java](https://github.com/awslabs/amazon-kinesis-client/blob/v1.x/src/main/java/com/amazonaws/services/kinesis/leases/impl/Lease.java) 和 KCL 2.x 的 [https://github.com/awslabs/amazon-kinesis-client/blob/master/amazon-kinesis-client/src/main/java/software/amazon/kinesis/leases/Lease.](https://github.com/awslabs/amazon-kinesis-client/blob/master/amazon-kinesis-client/src/main/java/software/amazon/kinesis/leases/Lease.java) java。
+ **租约表** – 唯一的 Amazon DynamoDB 表，用于跟踪 KDS 数据流中由 KCL 消费端应用程序的工作程序租赁和处理的分片。在 KCL 消费端应用程序运行时，租约表必须与数据流中的最新分片信息保持同步（在工作程序内部和所有工作程序之间）。有关更多信息，请参阅 [使用租约表跟踪 KCL 消费端应用程序处理的分片](#shared-throughput-kcl-consumers-leasetable)。
+ **记录处理器** – 定义 KCL 消费端应用程序如何处理从数据流中获取的数据的逻辑。在运行时，KCL 消费端应用程序实例会实例化一个工作程序，该工作程序会为持有租约的每个分片实例化一个记录处理器。

## 使用租约表跟踪 KCL 消费端应用程序处理的分片
<a name="shared-throughput-kcl-consumers-leasetable"></a>

**Topics**
+ [什么是租约表](#shared-throughput-kcl-consumers-what-is-leasetable)
+ [吞吐量](#shared-throughput-kcl-leasetable-throughput)
+ [租约表如何与 Kinesis 数据流中的分片同步](#shared-throughput-kcl-consumers-leasetable-sync)

### 什么是租约表
<a name="shared-throughput-kcl-consumers-what-is-leasetable"></a>

对于每个 Amazon Kinesis Data Streams 应用程序，KCL 都使用一份唯一的租约表（存储在 Amazon DynamoDB 表中）来跟踪 KDS 数据流中由 KCL 消费端应用程序的工作程序租赁和处理的分片。

**重要**  
KCL 使用消费端应用程序的名称来创建该消费端应用程序使用的租约表的名称，因此每个消费端应用程序的名称必须是唯一的。

您可在消费端应用程序运行的同时使用 [Amazon DynamoDB 控制台](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ConsoleDynamoDB.html)查看租约表。

如果应用程序启动时 KCL 消费端应用程序的租约表不存在，则其中一个工作程序会为此应用程序创建租约表。

**重要**  
 除开与 Kinesis Data Streams 本身关联的费用，您的账户将被收取与 DynamoDB 表关联的费用。

租约表中的每行表示您消费端应用程序正在处理的分片。如果 KCL 消费端应用程序仅处理一个数据流，则租约表的哈希键 `leaseKey` 就是分片 ID。如果您[使用相同的适用于 Java 的 KCL 2.x 消费端应用程序处理多个数据流](#shared-throughput-kcl-multistream)，则 leaseKey 的结构如下：`account-id:StreamName:streamCreationTimestamp:ShardId`。例如 `111111111:multiStreamTest-1:12345:shardId-000000000336`。

除了分片 ID 以外，每行还包含以下数据：
+ **checkpoint：**分片的最新检查点序号。此值在数据流的所有分片中都是唯一的。
+ **checkpointSubSequence数字：**使用 Kinesis Producer 库的聚合功能时，这是对**检查点**的扩展，用于跟踪 Kinesis 记录中的单个用户记录。
+ **leaseCounter：**用于租赁版本控制，这样工作程序可以检测其租赁已由其他工作程序获取。
+ **leaseKey：**租赁的唯一标识符。每份租约都是数据流中一个分片所特有的，一份由一个工作程序持有。
+ **leaseOwner：**持有此租赁的工作程序。
+ **ownerSwitchesSince检查点：**自上次写检查点以来，这份租约更换了多少次员工。
+ **parentShardId：**用于确保在子分片上开始处理之前，父分片已得到完全处理。这可以确保记录按照放入流中的相同顺序处理。
+ **hashrange：**`PeriodicShardSyncManager` 用来运行定期同步，以查找租约表中缺少的分片，并在需要时为分片创建租约。
**注意**  
从 KCL 1.14 和 KCL 2.3 开始的每个分片的租约表中都有此数据。有关租约和分片之间的 `PeriodicShardSyncManager` 和定期同步的更多信息，请参阅 [租约表如何与 Kinesis 数据流中的分片同步](#shared-throughput-kcl-consumers-leasetable-sync)。
+ **childshards：**`LeaseCleanupManager` 用来查看子分片的处理状态并决定是否可以从租约表中删除父分片。
**注意**  
从 KCL 1.14 和 KCL 2.3 开始的每个分片的租约表中都有此数据。
+ **shardID：**分片的 ID。
**注意**  
仅当您[使用相同的适用于 Java 的 KCL 2.x 消费端应用程序处理多个数据流](#shared-throughput-kcl-multistream)时，此数据才会出现在租约表中。只有适用于 Java 的 KCL 2.x 才支持此功能，且从适用于 Java 的 KCL 2.3 及更高版本开始才支持此功能。
+ **stream name** 数据流的标识符采用以下格式：`account-id:StreamName:streamCreationTimestamp`。
**注意**  
仅当您[使用相同的适用于 Java 的 KCL 2.x 消费端应用程序处理多个数据流](#shared-throughput-kcl-multistream)时，此数据才会出现在租约表中。只有适用于 Java 的 KCL 2.x 才支持此功能，且从适用于 Java 的 KCL 2.3 及更高版本开始才支持此功能。

### 吞吐量
<a name="shared-throughput-kcl-leasetable-throughput"></a>

如果您的 Amazon Kinesis Data Streams 收到了预置的吞吐量异常，您应为 DynamoDB 表增加预置的吞吐量。KCL 将创建预置吞吐量为 10 次读取/秒和 10 次写入/秒的表，但这可能无法满足您应用程序的需求。例如，如果您的 Amazon Kinesis Data Streams 执行频繁的检查点操作或对由很多分片组成的流执行操作，您可能需要更多吞吐量。

有关 DynamoDB 表中预置吞吐量的信息，请参阅《Amazon DynamoDB 开发人员指南》**中的[读/写容量模式](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.ReadWriteCapacityMode.html)和[使用表和数据](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithDDTables.html)。

### 租约表如何与 Kinesis 数据流中的分片同步
<a name="shared-throughput-kcl-consumers-leasetable-sync"></a>

KCL 消费端应用程序中的工作程序使用租约来处理指定数据流中的分片。哪个工作程序在指定时间租赁哪个分片的相关信息都存储在租约表中。在 KCL 消费端应用程序运行期间，租约表必须与数据流中的最新分片信息保持同步。在消费端应用程序引导启动期间（初始化或重新启动消费端应用程序时），以及每当正在处理的分片结束时（重新分片），KCL 都会将租约表与从 Kinesis Data Streams 服务获取的分片信息同步。换言之，在消费端应用程序初始引导启动期间，以及每当消费端应用程序遇到数据流重新分片事件时，工作程序或 KCL 消费端应用程序都会与其正在处理的数据流同步。

**Topics**
+ [KCL 1.0 - 1.13 和 KCL 2.0 - 2.2 中的同步](#shared-throughput-kcl-consumers-leasetable-sync-old)
+ [KCL 2.x 中的同步从 KCL 2.3 及更高版本开始](#shared-throughput-kcl-consumers-leasetable-sync-new-kcl2)
+ [KCL 1.x 中的同步从 KCL 1.14 及更高版本开始](#shared-throughput-kcl-consumers-leasetable-sync-new-kcl1)

#### KCL 1.0 - 1.13 和 KCL 2.0 - 2.2 中的同步
<a name="shared-throughput-kcl-consumers-leasetable-sync-old"></a>

在 KCL 1.0-1.13 和 KCL 2.0-2.2 中，在使用者应用程序的引导期间以及每个数据流重新分片事件期间，KCL 通过调用或发现将租用表与从 Kinesis Data Streams 服务获取的分片信息同步。`ListShards` `DescribeStream` APIs在上面列出的所有 KCL 版本中，KCL 使用者应用程序的每个 worker 都要完成以下步骤，以便在使用者应用程序的引导期间和每个流 reshard 事件中执行 lease/shard 同步过程：
+ 获取正在处理的流中数据的所有分片
+ 从租约表中获取所有分片租约
+ 筛选出租约表中没有租约的所有开放分片
+ 迭代所有找到的开放分片以及没有开放父分片的所有开放分片：
  + 遍历层次结构树的原级路径，确定该分片是否为后代分片。如果正在处理原级分片（租约表中存在原级分片的租约条目）或者应该处理原级分片（例如初始位置为 `TRIM_HORIZON` 或 `AT_TIMESTAMP`），则该分片被视为后代分片
  + 如果上下文中的开放分片是后代分片，KCL 会根据初始位置对分片执行检查点操作，并在需要时为其父分片创建租约

#### KCL 2.x 中的同步从 KCL 2.3 及更高版本开始
<a name="shared-throughput-kcl-consumers-leasetable-sync-new-kcl2"></a>

从支持的最新版本 KCL 2.x（KCL 2.3）及更高版本开始，该库现在支持对同步过程进行以下更改。这些 lease/shard 同步更改显著减少了 KCL 使用者应用程序对 Kinesis Data Streams 服务进行的 API 调用次数，并优化了 KCL 使用者应用程序中的租赁管理。
+ 在应用程序的引导启动过程中，如果租约表为空，KCL 将利用 `ListShard` API 的筛选选项（`ShardFilter` 可选请求参数），仅针对在 `ShardFilter` 参数指定时间开放的分片的快照检索和创建租约。`ShardFilter` 参数可以让您筛选出 `ListShards` API 的响应。`ShardFilter` 参数唯一需要的属性是 `Type`。KCL 使用 `Type` 筛选属性及其以下有效值来识别并返回可能需要新租约的开放分片的快照：
  + `AT_TRIM_HORIZON` – 响应包含在 `TRIM_HORIZON` 时开放的所有分片。
  + `AT_LATEST` – 响应仅包含数据流中当前开放的分片。
  + `AT_TIMESTAMP` – 响应包含起始时间戳小于或等于指定时间戳且结束时间戳大于或等于指定时间戳的所有分片，或仍处于开放状态的所有分片。

  `ShardFilter` 用于为空租约表创建租约，以初始化在 `RetrievalConfig#initialPositionInStreamExtended` 中指定的分片快照的租约。

  有关 `ShardFilter`的更多信息，请参阅[https://docs.aws.amazon.com/kinesis/latest/APIReference/API_ShardFilter.html](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_ShardFilter.html)。
+ 不是所有工作人员都执行 lease/shard 同步以使租赁表与数据流中的最新分片保持同步，而是由一个当选的工作领导者执行租赁/分片同步。
+ KCL 2.3 使用`GetRecords`和的`ChildShards`返回参数对已关闭的分片执行 lease/shard 同步，从而允许 KCL 工作程序仅为其完成处理的分片的子分片创建租约。`SubscribeToShard` APIs `SHARD_END`为了在整个消费者应用程序中共享， lease/shard 同步的这种优化使用了 `GetRecords` API 的`ChildShards`参数。对于专用吞吐量（增强扇出）消费者应用程序， lease/shard 同步的这种优化使用 API 的`ChildShards``SubscribeToShard`参数。有关更多信息，请参阅 [GetRecords](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_GetRecords.html)、[SubscribeToShards](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_SubscribeToShard.html) 和 [ChildShard](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_ChildShard.html)。
+ 经过上述更改，KCL 的行为正在从所有工作程序学习所有现有分片的模式，转变为工作程序只学习每个工作程序拥有的分片的子分片的模式。因此，除了在使用者应用程序引导和重新分片事件期间发生的同步外，KCL 现在还会执行额外的定期 shard/lease 扫描，以识别租赁表中的任何潜在漏洞（换句话说，了解所有新分片），以确保处理数据流的完整哈希范围，并在需要时为它们创建租约。 `PeriodicShardSyncManager`是负责运行定期 lease/shard 扫描的组件。

  有关 KCL 2.3 `PeriodicShardSyncManager` 中的更多信息，请参阅 [https://github.com/awslabs/amazon-kinesis-client/blob/master/amazon-kinesis-client/src/main/java/software/amazon/kinesis/leases/LeaseManagementConfig.java \$1L201](https://github.com/awslabs/amazon-kinesis-client/blob/master/amazon-kinesis-client/src/main/java/software/amazon/kinesis/leases/LeaseManagementConfig.java#L201-L213)-L213。

  在 KCL 2.3 中，可以使用新的配置选项来配置 `LeaseManagementConfig` 中的 `PeriodicShardSyncManager`：    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/streams/latest/dev/shared-throughput-kcl-consumers.html)

  现在还会发布新的 CloudWatch 指标来监控的`PeriodicShardSyncManager`运行状况。有关更多信息，请参阅 [PeriodicShardSyncManager](monitoring-with-kcl.md#periodic-task)。
+ 包括对 `HierarchicalShardSyncer` 的优化，可仅为一层分片创建租约。

#### KCL 1.x 中的同步从 KCL 1.14 及更高版本开始
<a name="shared-throughput-kcl-consumers-leasetable-sync-new-kcl1"></a>

从支持的最新版本 KCL 1.x（KCL 1.14）及更高版本开始，该库现在支持对同步过程进行以下更改。这些 lease/shard 同步更改显著减少了 KCL 使用者应用程序对 Kinesis Data Streams 服务进行的 API 调用次数，并优化了 KCL 使用者应用程序中的租赁管理。
+ 在应用程序的引导启动过程中，如果租约表为空，KCL 将利用 `ListShard` API 的筛选选项（`ShardFilter` 可选请求参数），仅针对在 `ShardFilter` 参数指定时间开放的分片的快照检索和创建租约。`ShardFilter` 参数可以让您筛选出 `ListShards` API 的响应。`ShardFilter` 参数唯一需要的属性是 `Type`。KCL 使用 `Type` 筛选属性及其以下有效值来识别并返回可能需要新租约的开放分片的快照：
  + `AT_TRIM_HORIZON` – 响应包含在 `TRIM_HORIZON` 时开放的所有分片。
  + `AT_LATEST` – 响应仅包含数据流中当前开放的分片。
  + `AT_TIMESTAMP` – 响应包含起始时间戳小于或等于指定时间戳且结束时间戳大于或等于指定时间戳的所有分片，或仍处于开放状态的所有分片。

  `ShardFilter` 用于为空租约表创建租约，以初始化在 `KinesisClientLibConfiguration#initialPositionInStreamExtended` 中指定的分片快照的租约。

  有关 `ShardFilter`的更多信息，请参阅[https://docs.aws.amazon.com/kinesis/latest/APIReference/API_ShardFilter.html](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_ShardFilter.html)。
+ 不是所有工作人员都执行 lease/shard 同步以使租赁表与数据流中的最新分片保持同步，而是由一个当选的工作领导者执行租赁/分片同步。
+ KCL 1.14 使用`GetRecords`和的`ChildShards`返回参数对已关闭的`SubscribeToShard` APIs分片执行 lease/shard 同步，从而允许 KCL 工作程序仅为其完成处理的分片的子分片创建租约。`SHARD_END`有关更多信息，请参阅[GetRecords](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_GetRecords.html)和[ChildShard](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_ChildShard.html)。
+ 经过上述更改，KCL 的行为正在从所有工作程序学习所有现有分片的模式，转变为工作程序只学习每个工作程序拥有的分片的子分片的模式。因此，除了在使用者应用程序引导和重新分片事件期间发生的同步外，KCL 现在还会执行额外的定期 shard/lease 扫描，以识别租赁表中的任何潜在漏洞（换句话说，了解所有新分片），以确保处理数据流的完整哈希范围，并在需要时为它们创建租约。 `PeriodicShardSyncManager`是负责运行定期 lease/shard 扫描的组件。

  如果 `KinesisClientLibConfiguration#shardSyncStrategyType` 设置为 `ShardSyncStrategyType.SHARD_END`，则 `PeriodicShardSync leasesRecoveryAuditorInconsistencyConfidenceThreshold` 用于确定租约表中包含漏洞的连续扫描次数的阈值，之后将强制执行分片同步。当 `KinesisClientLibConfiguration#shardSyncStrategyType` 设置为时 `ShardSyncStrategyType.PERIODIC`，`leasesRecoveryAuditorInconsistencyConfidenceThreshold` 将被忽略。

  有关 KCL 1.14 `PeriodicShardSyncManager` 中的更多信息，请参阅 [https://github.com/awslabs/amazon-kinesis-client/blob/v1.x/src/main/java/com/amazonaws/services/kinesis/clientlibrary/lib/worker/KinesisClientLibConfiguration.java](https://github.com/awslabs/amazon-kinesis-client/blob/v1.x/src/main/java/com/amazonaws/services/kinesis/clientlibrary/lib/worker/KinesisClientLibConfiguration.java#L987-L999) \$1L987-L999。

  在 KCL 1.14 中，可以使用新的配置选项来配置 `LeaseManagementConfig` 中的 `PeriodicShardSyncManager`：    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/streams/latest/dev/shared-throughput-kcl-consumers.html)

  现在还会发布新的 CloudWatch 指标来监控的`PeriodicShardSyncManager`运行状况。有关更多信息，请参阅 [PeriodicShardSyncManager](monitoring-with-kcl.md#periodic-task)。
+ KCL 1.14 现在还支持延期租约清理。当分片超过数据流的保留期或因重新分片操作而关闭时，`LeaseCleanupManager` 会在到达 `SHARD_END` 时异步删除租约。

  可以使用新的配置选项来配置 `LeaseCleanupManager`。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/streams/latest/dev/shared-throughput-kcl-consumers.html)
+ 包括对 `KinesisShardSyncer` 的优化，可仅为一层分片创建租约。

## 使用相同的适用于 Java 的 KCL 2.x 消费端应用程序处理多个数据流
<a name="shared-throughput-kcl-multistream"></a>

本节介绍了适用于 Java 的 KCL 2.x 中的以下更改，这些更改让您能够创建可同时处理多个数据流的 KCL 消费端应用程序。

**重要**  
只有适用于 Java 的 KCL 2.x 才支持多流处理功能，且从适用于 Java 的 KCL 2.3 及更高版本开始才支持此功能。  
其他可以实现 KCL 2.x 的语言都不支持多流处理功能。  
任何版本的 KCL 1.x 都不支持多流处理功能。
+ **MultistreamTracker 接口**

  要构建可以同时处理多个流的使用者应用程序，必须实现一个名为的新接口[MultistreamTracker](https://github.com/awslabs/amazon-kinesis-client/blob/0c5042dadf794fe988438436252a5a8fe70b6b0b/amazon-kinesis-client/src/main/java/software/amazon/kinesis/processor/MultiStreamTracker.java)。此接口包括返回要由 KCL 消费端应用程序处理的数据流及其配置列表的 `streamConfigList` 方法。请注意，正在处理的数据流可以在消费端应用程序运行时进行更改。KCL 会定期调用 `streamConfigList` 来了解要处理的数据流的变化。

  该`streamConfigList`方法填充[StreamConfig](https://github.com/awslabs/amazon-kinesis-client/blob/0c5042dadf794fe988438436252a5a8fe70b6b0b/amazon-kinesis-client/src/main/java/software/amazon/kinesis/common/StreamConfig.java#L23)列表。

  ```
  package software.amazon.kinesis.common;
  
  import lombok.Data;
  import lombok.experimental.Accessors;
  
  @Data
  @Accessors(fluent = true)
  public class StreamConfig {
      private final StreamIdentifier streamIdentifier;
      private final InitialPositionInStreamExtended initialPositionInStreamExtended;
      private String consumerArn;
  }
  ```

  请注意，`StreamIdentifier` 和 `InitialPositionInStreamExtended` 是必填字段，`consumerArn` 是选填字段。只有在使用 KCL 2.x 实现增强型扇出消费端应用程序时，才必须提供 `consumerArn`。

  有关的更多信息`StreamIdentifier`，请参阅 [https://github.com/awslabs/amazon-kinesis-client/blob/v2.5.8/amazon-kinesis-client/src/main/java/software/amazon/kinesis/common/StreamIdentifier.java \$1L129](https://github.com/awslabs/amazon-kinesis-client/blob/v2.5.8/amazon-kinesis-client/src/main/java/software/amazon/kinesis/common/StreamIdentifier.java#L129). 要创建 `StreamIdentifier`，我们建议您从 v2.5.0 及更高版本提供的 `streamArn` 和 `streamCreationEpoch` 创建一个多流实例。在不支持 `streamArm` 的 KCL v2.3 和 v2.4 中，请使用格式 `account-id:StreamName:streamCreationTimestamp` 创建一个多流实例。从下一个主要版本开始，此格式将弃用且不再受支持。

  `MultistreamTracker` 还包括可删除租约表中旧流租约的策略（`formerStreamsLeasesDeletionStrategy`）。请注意，在消费端应用程序运行时无法更改策略。欲了解更多信息，请参阅 [https://github.com/awslabs/amazon-kinesis-client/blob/0c5042dadf794fe988438436252a5a8fe70b6b0 .java b/amazon-kinesis-client/src/main/java/software/amazon/kinesis/processor/FormerStreamsLeasesDeletionStrategy](https://github.com/awslabs/amazon-kinesis-client/blob/0c5042dadf794fe988438436252a5a8fe70b6b0b/amazon-kinesis-client/src/main/java/software/amazon/kinesis/processor/FormerStreamsLeasesDeletionStrategy.java)
+ [ConfigsBuilder](https://github.com/awslabs/amazon-kinesis-client/blob/0c5042dadf794fe988438436252a5a8fe70b6b0b/amazon-kinesis-client/src/main/java/software/amazon/kinesis/common/ConfigsBuilder.java)是一个应用程序范围的类，可用于指定构建 KCL 使用者应用程序时要使用的所有 KCL 2.x 配置设置。 `ConfigsBuilder`类现在支持该`MultistreamTracker`接口。你可以用一个数据流的名称进行初始化 ConfigsBuilder以使用来自以下内容的记录：

  ```
   /**
       * Constructor to initialize ConfigsBuilder with StreamName
       * @param streamName
       * @param applicationName
       * @param kinesisClient
       * @param dynamoDBClient
       * @param cloudWatchClient
       * @param workerIdentifier
       * @param shardRecordProcessorFactory
       */
      public ConfigsBuilder(@NonNull String streamName, @NonNull String applicationName,
              @NonNull KinesisAsyncClient kinesisClient, @NonNull DynamoDbAsyncClient dynamoDBClient,
              @NonNull CloudWatchAsyncClient cloudWatchClient, @NonNull String workerIdentifier,
              @NonNull ShardRecordProcessorFactory shardRecordProcessorFactory) {
          this.appStreamTracker = Either.right(streamName);
          this.applicationName = applicationName;
          this.kinesisClient = kinesisClient;
          this.dynamoDBClient = dynamoDBClient;
          this.cloudWatchClient = cloudWatchClient;
          this.workerIdentifier = workerIdentifier;
          this.shardRecordProcessorFactory = shardRecordProcessorFactory;
      }
  ```

  或者，`MultiStreamTracker`如果要实现同时处理多个流的 KCL 使用者应用程序，也可以使用进行初始化 ConfigsBuilder 。

  ```
  * Constructor to initialize ConfigsBuilder with MultiStreamTracker
       * @param multiStreamTracker
       * @param applicationName
       * @param kinesisClient
       * @param dynamoDBClient
       * @param cloudWatchClient
       * @param workerIdentifier
       * @param shardRecordProcessorFactory
       */
      public ConfigsBuilder(@NonNull MultiStreamTracker multiStreamTracker, @NonNull String applicationName,
              @NonNull KinesisAsyncClient kinesisClient, @NonNull DynamoDbAsyncClient dynamoDBClient,
              @NonNull CloudWatchAsyncClient cloudWatchClient, @NonNull String workerIdentifier,
              @NonNull ShardRecordProcessorFactory shardRecordProcessorFactory) {
          this.appStreamTracker = Either.left(multiStreamTracker);
          this.applicationName = applicationName;
          this.kinesisClient = kinesisClient;
          this.dynamoDBClient = dynamoDBClient;
          this.cloudWatchClient = cloudWatchClient;
          this.workerIdentifier = workerIdentifier;
          this.shardRecordProcessorFactory = shardRecordProcessorFactory;
      }
  ```
+ 通过为您的 KCL 消费端应用程序实现多流支持功能，应用程序租约表的每一行现在都包含该应用程序处理的多个数据流的分片 ID 和流名称。
+ 在为 KCL 消费端应用程序实现多流支持功能后，leaseKey 采用以下结构：`account-id:StreamName:streamCreationTimestamp:ShardId`。例如 `111111111:multiStreamTest-1:12345:shardId-000000000336`。
**重要**  
当现有 KCL 消费端应用程序配置为仅处理一个数据流时，leaseKey（租约表的哈希键）就是分片 ID。如果您将此现有 KCL 消费端应用程序重新配置为处理多个数据流，则会破坏租约表，因为支持多流处理功能后，leaseKey 必须采用如下结构：`account-id:StreamName:StreamCreationTimestamp:ShardId`。

## 将 KCL 与 AWS Glue 架构注册表一起使用
<a name="shared-throughput-kcl-consumers-glue-schema-registry"></a>

您可以将 Kinesis 数据流与 AWS Glue 架构注册表集成。 AWS Glue 架构注册表能帮助您集中发现、控制和演变架构，同时确保注册架构持续验证生成的数据。架构定义了数据记录的结构和格式。架构是用于可靠数据发布、使用或存储的版本化规范。 AWS Glue Schema Registr end-to-end y 允许您改善流媒体应用程序中的数据质量和数据治理。有关更多信息，请参阅 [AWS Glue Schema Registry](https://docs.aws.amazon.com/glue/latest/dg/schema-registry.html)。设置此集成的方法之一是使用适用于 Java 的 KCL。

**重要**  
目前，只有使用用 Java 实现的 KCL 2.3 使用者的 Kinesis 数据流支持 Kinesis Streams AWS Glue 和 Schema Registry 集成。不提供多语言支持。不支持 KCL 1.0 消费端。不支持 KCL 2.3 之前的 KCL 2.x 消费端。

有关如何使用 KCL 设置 Kinesis Data Streams 与架构注册表集成的详细说明，请参阅 “用[例：将 Amazon Kinesis Data Streams 与 Glu KPL/KCL e 架构注册表集成” 中的 “使用库与 AWS](https://docs.aws.amazon.com/glue/latest/dg/schema-registry-integrations.html#schema-registry-integrations-kds)数据交互” 部分。