亚马逊Kinesis 1MB大小限制解决方法

5
根据AWS文档的报道:

记录数据有效负载在进行base64编码之前的最大大小为1 MiB。

由于我需要处理可能大于1 MB的记录,因此这个限制可能会成为问题。
是否有任何解决此限制的方法?如果已经有任何被证明的解决方案并且由任何人实施和使用(我想避免“重新发明轮子”)?
1个回答

8
你有两个选择:将负载分成多个记录或将其保存在流外,例如在S3中。
对于第一种选择,您可以利用PartitionKey和SequenceNumberForOrdering(doc)。为每个源记录分配唯一的分区键(例如UUID)。如果需要将源分成小于1MB的子块,则将序列号设置为2..N的块的返回序列号。
然后,客户端需要检查检索记录的分区键,并在必要时重构原始记录。请注意,他们可能需要缓冲几个块(用于不同的源记录)。
外部化数据将简化生产者和消费者代码。同样,为每个源记录创建一个唯一标识符,但是不要将记录写入流,而是将其写入带有该标识符作为键的S3中。然后将键写入流。当消费者从流中读取ID时,它将从S3检索实际数据。
这种第二种方法需要更多的管理工作:您需要向S3添加一个生命周期规则来删除记录,并确保此生命周期规则让对象至少与流的保留期一样长(无论流的保留期如何,我可能会设置8天的TTL,因为S3很便宜)。
如果您只有偶尔的大型记录,特别是如果您有大量的小型记录,那么将所有内容写入S3将效率低下。在这种情况下,您可以采用混合模型,在其中将数据结构写入流,该数据结构包含实际数据或对外部存储的引用。

感谢您的回答!我可能会对拆分有效载荷并在之后合并的方法感兴趣。但如果这个任务的逻辑已经被其他人实现了,我不想“重复造轮子”。例如,我发现了AWS Labs的这个项目https://github.com/awslabs/kinesis-aggregation/tree/master/python:有没有人使用过它,并确认它适用于这种情况或者可能推荐一个不同的库? - Vzzarr
你好 @Vzzarr,您能否确认一下聚合和解聚模块(https://github.com/awslabs/kinesis-aggregation/tree/master/python)是否符合您的需求?从其 ReadMe 中可以看出,它在生产者端进行聚合,在消费者端进行解聚,而您的要求恰恰相反。 - Shuchi Sethi
嗨@ShuchiSethi,最终我们使用纯Kafka将数据转储到S3,然后使用AWS Glue(AWS提供的ETL服务)来实现我们的架构。该库似乎不符合我的要求,所以我转向了一个“非常不同”的解决方案哈哈。 - Vzzarr
该链接的项目并没有解决这个问题。它实现了一种聚合方法,可以将多个小的Kinesis用户记录拟合到单个Kinesis数据流记录中,其限制为1MB,以减少成本并提高带宽效率。https://github.com/awslabs/kinesis-aggregation https://docs.aws.amazon.com/streams/latest/dev/kinesis-kpl-concepts.html - pllx
这两个方案的速度相当吗?S3比“打破有效负载”方法慢吗? - yucer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接