当记录小于 25KB 最小有效负载单元时,如何有效地批处理放入 Kinesis 的记录?

How can records put to Kinesis be efficiently batched when smaller than the 25KB minimum payload unit?

更新:

为了更详细地说明问题,put_records 根据提交的记录(分区键)数量和记录大小收费。任何小于 25KB 的记录都按一个 PU (Payload Unit) 计费。我们的个人记录平均每秒约 100 字节。如果我们将它们单独放置,我们将在 PU 上花费比我们需要多几个数量级的钱。

无论采用何种解决方案,我们都希望给定的 UID 始终位于同一个分片中,以简化 Kinesis 另一端的工作。如果将 UID 用作分区键,这自然会发生。

处理这个问题的一种方法是继续为每个 UID 做 puts,但及时缓冲它们。但是为了有效地使用 PU,我们最终会在流中引入 250 秒的延迟。

此处给出的答案与 的组合为我提供了将多个用户 ID 映射到每个分片的静态(预定)分区键的策略。

这将允许将多个 UID 分批放入一个有效负载单元(使用目标分片的共享分区键),这样它们就可以在每秒写入时写出,同时确保给定的 UID 以正确的方式结束碎片.

然后我只需要为每个分片提供一个缓冲区,只要有足够的记录,总计不到 25KB 或达到 500 条记录(每个 put_records 调用的最大值),就可以推送数据。

如果将给定的 UID 用作分区键,则只需提前弄清楚它自然会映射到哪个分片。

AWS Kinesis documentation说的是这个方法:

Partition keys are Unicode strings with a maximum length limit of 256 bytes. An MD5 hash function is used to map partition keys to 128-bit integer values and to map associated data records to shards.

除非有人这样​​做过,否则我将尝试查看 this question 中的方法是否生成有效映射。我想知道在执行 MD5 之前是否需要将常规 Python 字符串转换为 unicode 字符串。

可能还有其他解决方案,但这应该可行,如果没有挑战者出现,我将在此处接受现有答案。

先前回答的摘录:

  1. Try generating a few random partition_keys, and send distinct value with them to the stream.
  2. Run a consumer application and see which shard delivered which value.
  3. Then map the partition keys which you used to send each record with the corresponding shard.

So, now that you know which partition key to use while sending data to a specific shard, you can use this map while sending those special "to be multiplexed" records...

It's hacky and brute force, but it will work.

Also see previous answer regarding partition keys and shards:

Hope this helps.

PS: If you use low level Kinesis APIs and create a custom PutRecord request, in the response you can find which shard the data is placed upon. PutRecordResponse contains shardId information;

http://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecord.html

来源: