Amazon Kinesis 1 MB 大小限制解决方法
Amazon Kinesis 1 MB size limit workaround
报道
The maximum size of the data payload of a record before base64-encoding is up to 1 MiB.
因为我需要处理大小可能大于 1 MB 的记录,所以这个限制可能是个问题。
是否有解决此限制的方法?如果任何人已经实施和使用任何经过验证的解决方案? (我想避免 "reinventing the wheel")
您有两个选择:将负载分解为多个记录或将其保存在流外,例如在 S3 中。
对于第一个选项,您可以使用 PartitionKey
和 SequenceNumberForOrdering
(doc)。为每个源记录分配一个唯一的分区键(例如 UUID)。如果您需要将源分成 1MB 以下的块,请将块 2..N 的序列号设置为前一个块的返回序列号。
这将要求客户端检查检索记录的分区键,并在必要时重建原始记录。请注意,他们可能需要缓冲几个块(针对不同的源记录)。
外部化数据将简化生产者和消费者代码。同样,为每个源记录创建一个唯一标识符,但不是将记录写入流,而是将其写入 S3,并使用该标识符作为其键。然后将密钥写入流。然后,消费者将从流中读取 ID 时从 S3 检索实际数据。
第二种方法确实需要更多管理:您需要向 S3 添加生命周期规则以删除记录,并且您需要确保此生命周期规则让对象存活 至少 与流的保留期一样长(我可能会设置 8 天的 TTL,而不考虑流的保留期,因为 S3 很便宜)。
如果您只有不常见的大记录,尤其是如果您有很多小记录,那么将所有内容写入 S3 将是低效的。在这种情况下,您可以采用混合模型,在该模型中,您将数据结构写入包含实际数据或对外部存储的引用的流。
The maximum size of the data payload of a record before base64-encoding is up to 1 MiB.
因为我需要处理大小可能大于 1 MB 的记录,所以这个限制可能是个问题。
是否有解决此限制的方法?如果任何人已经实施和使用任何经过验证的解决方案? (我想避免 "reinventing the wheel")
您有两个选择:将负载分解为多个记录或将其保存在流外,例如在 S3 中。
对于第一个选项,您可以使用 PartitionKey
和 SequenceNumberForOrdering
(doc)。为每个源记录分配一个唯一的分区键(例如 UUID)。如果您需要将源分成 1MB 以下的块,请将块 2..N 的序列号设置为前一个块的返回序列号。
这将要求客户端检查检索记录的分区键,并在必要时重建原始记录。请注意,他们可能需要缓冲几个块(针对不同的源记录)。
外部化数据将简化生产者和消费者代码。同样,为每个源记录创建一个唯一标识符,但不是将记录写入流,而是将其写入 S3,并使用该标识符作为其键。然后将密钥写入流。然后,消费者将从流中读取 ID 时从 S3 检索实际数据。
第二种方法确实需要更多管理:您需要向 S3 添加生命周期规则以删除记录,并且您需要确保此生命周期规则让对象存活 至少 与流的保留期一样长(我可能会设置 8 天的 TTL,而不考虑流的保留期,因为 S3 很便宜)。
如果您只有不常见的大记录,尤其是如果您有很多小记录,那么将所有内容写入 S3 将是低效的。在这种情况下,您可以采用混合模型,在该模型中,您将数据结构写入包含实际数据或对外部存储的引用的流。