英文版本为准
本页译自英文,由模型翻译。若与英文原文存在差异,以英文原文为准。
路径
一条 Kinesis 记录在 RustStream 服务中的路径:读取、投递、处理器、应答和检查点,逐条进行或按批进行。
以文字阅读本图
- 逐条: GetRecords 最多 1000 条记录; 通道 64 次投递,所有分片; KinesisMessage 消息头、水位线位置; 处理器 解码并运行; 应答:PutRecord 解析出的分区键; ack 连续时写入检查点
- 按批: GetRecords 上限 n,最多 10,000; 通道 64 次投递; 一个批 n 条记录或 50 毫秒; 批处理器 每个批调用一次; 每个元素 各自结算
- GetRecords 最多 1000 条记录 → 通道 64 次投递,所有分片: 记录
- 通道 64 次投递,所有分片 → KinesisMessage 消息头、水位线位置
- KinesisMessage 消息头、水位线位置 → 处理器 解码并运行
- 处理器 解码并运行 → 应答:PutRecord 解析出的分区键
- 应答:PutRecord 解析出的分区键 → ack 连续时写入检查点
- GetRecords 上限 n,最多 10,000 → 通道 64 次投递
- 通道 64 次投递 → 一个批 n 条记录或 50 毫秒
- 一个批 n 条记录或 50 毫秒 → 批处理器 每个批调用一次
- 批处理器 每个批调用一次 → 每个元素 各自结算
分片的读取者每次 GetRecords 最多请求 1,000 条记录。每条记录都变成一个 KinesisMessage:载荷从 SDK 的应答中复制出来,如果载荷带有信封,就从中读出信封。分区键、序列号和分片 id 变成消息头。投递还在分片的水位线中占据自己的位置,水位线决定它的检查点。每条记录有少数几次内存分配,基准测试公布一条记录的开销。
订阅的每个读取者都把投递送进同一个容量为 64 的通道。通道满时读取者等待,因此读取的节奏由处理器决定。读取在送出之前打上标记:如果读取还在进行时订阅重新定位,这次读取的记录会在离开通道时被丢弃,永远不会交给处理器。
批订阅把它的批大小作为每次读取的上限,最多为一次读取能返回的 10,000 条。批在容纳了这么多记录时关闭,或在第一条记录到达 50 毫秒后关闭,因此一个批往往小于这个大小。一个批可能包含多个分片的记录。每个元素各自结算,有自己的检查点。
应答编码进分发循环复用的缓冲区。分区键依次取自发布调用、partition-key 消息头和策略,谁也没有指定键的记录会得到一个把记录分散到各个分片上的键。用户消息头进入信封,不带消息头的应答就是原样的编码缓冲区。KinesisPublisher 用一次 PutRecord 写入它,使用发布所在运行时的 SDK 客户端。
投递在应答之后结算。ack 只在推进分片的水位线时才写入检查点,结算一页用图说明了这一点。