【问题标题】:Amazon Kinesis 1 MB size limit workaroundAmazon Kinesis 1 MB 大小限制解决方法
【发布时间】:2018-12-07 14:50:02
【问题描述】:

AWS documentation报道的那样

base64 编码前记录的数据负载最大为 1 MiB。

因为我需要处理大小可能大于 1 MB 的记录,所以这个限制可能是个问题。

是否有任何解决方法可以克服此限制?如果任何人已经实施和使用了任何经过验证的解决方案? (我想避免“重新发明轮子”)

【问题讨论】:

    标签: amazon-web-services amazon-kinesis


    【解决方案1】:

    您有两种选择:将有效负载分成多条记录或将其保存在流之外,例如在 S3 中。

    对于第一个选项,您可以使用PartitionKeySequenceNumberForOrdering (doc)。为每个源记录分配一个唯一的分区键(例如 UUID)。如果您需要将源分成 1MB 以下的块,请将块 2..N 的序列号设置为前一个块的返回序列号。

    这将要求客户端检查检索记录的分区键,并在必要时重建原始记录。请注意,它们可能需要缓冲几个块(用于不同的源记录)。

    外部化数据将简化生产者和消费者的代码。同样,为每个源记录创建一个唯一标识符,但不是将记录写入流,而是使用该标识符作为其键将其写入 S3。然后将密钥写入流。消费者在从流中读取 ID 时,将从 S3 中检索实际数据。

    第二种方法确实需要更多的管理:您需要向 S3 添加生命周期规则以删除记录,并且您需要确保此生命周期规则让对象能够存活至少 em> 只要流的保留期(我可能会设置 8 天的 TTL,而不管流的保留期如何,因为 S3 很便宜)。

    如果您只有很少的大记录,特别是如果您有很多小记录,那么将所有内容都写入 S3 将是低效的。在这种情况下,您可以采用混合模型,在该模型中,您将数据结构写入包含实际数据或对外部存储的引用的流中。

    【讨论】:

    • 感谢您的回答!我可能对拆分有效负载并在之后合并它的方法感兴趣。但是我不想“重新发明轮子”并重写这个任务的逻辑,如果它已经被其他人实现了。例如,我在 AWS 实验室找到了这个项目 github.com/awslabs/kinesis-aggregation/tree/master/python:使用它的人可以确认它可能适合这个用例或可能推荐不同的库吗?
    • 嗨@Vzzarr 您能否确认用于聚合和解聚合的模块(github.com/awslabs/kinesis-aggregation/tree/master/python)是否适合您的需求?从它的自述文件来看,它在生产者端进行聚合,在消费者端进行解聚合,而您的要求正好相反。
    • HI @ShuchiSethi 最后已使用纯 Kafka 在 S3 中转储数据,然后使用 AWS Glue(来自 AWS 的 ETL 服务)来实现我们的架构。该库似乎不符合我的要求,所以我转向了一个“完全不同”的解决方案啊哈
    • 链接项目没有解决这个问题。它是一种聚合实现,可将多个小型 Kinesis 用户记录放入单个 Kinesis Data Stream 记录中,其限制为 1MB,以降低成本并提高带宽效率。 github.com/awslabs/kinesis-aggregationdocs.aws.amazon.com/streams/latest/dev/…
    • 这两种选择的速度是否相当? S3 是否比“破坏有效负载”方法慢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 2015-12-20
    • 1970-01-01
    • 2021-11-07
    相关资源
    最近更新 更多