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

Python 当小于25KB最小有效负载单位时,如何有效地批处理放入Kinesis的记录?,python,amazon-kinesis,Python,Amazon Kinesis,更新: 为了更详细地说明这个问题,put_记录是根据提交的记录数(分区键)和记录大小收费的。任何小于25KB的记录都按一个PU()计费。我们的个人记录平均每秒大约100字节。如果我们把它们单独放在一起,我们在PUs上的花费将比我们需要的多出几个数量级 无论采用哪种解决方案,我们都希望给定的UID始终位于同一个碎片中,以简化动觉另一端的工作。如果将UID用作分区键,则会自然发生这种情况 解决这个问题的一种方法是继续为每个UID执行PUT,但要及时缓冲它们。但是为了有效地使用PUs,我们将在流中引入

更新:

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

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

解决这个问题的一种方法是继续为每个UID执行PUT,但要及时缓冲它们。但是为了有效地使用PUs,我们将在流中引入250秒的延迟

这里给出的答案与我的答案相结合,为我提供了一种策略,用于将多个用户ID映射到每个碎片的静态(预定)分区键

这将允许将多个UID批处理到一个有效负载单元中(使用目标碎片的共享分区密钥),以便在它们每秒出现时将其写入,同时确保给定UID最终位于正确的碎片中

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

这就让我们提前知道,如果将给定UID用作分区键,它自然会映射到哪个分区

专家说这是一种方法:

分区键是Unicode字符串,最大长度限制为256 字节。MD5哈希函数用于将分区键映射到128位 整数值和,以将关联的数据记录映射到碎片

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


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

摘自上一个答案:

  • 尝试生成几个随机的分区密钥,并将不同的值一起发送到流
  • 运行消费者应用程序,查看哪个碎片提供了哪个价值
  • 然后将用于发送每条记录的分区键映射到相应的碎片
  • 现在,您已经知道在向服务器发送数据时要使用哪个分区键了 一个特定的碎片,你可以在将这些特殊的“碎片”发送到 “被多路复用”的记录

    这是骇客和野蛮的力量,但它会起作用

    另请参见前面关于分区键和碎片的回答:

    希望这有帮助

    PS:如果您使用低级别的Kinesis API并创建自定义PutRecord 请求,您可以在响应中找到放置数据的碎片 在上面PutRecordResponse包含shardId信息


    来源:

    如果问题是重复的,请将其标记为重复。我不确定,python标记有点混乱。其他问题不完全相同。有趣的解决方案,但在这种情况下并不可取,因为在随机分区键之间平衡实际UID将落在客户机身上,我们有1300万个UID。我们不能像其他答案所建议的那样为每个put随机生成分区键,因为我们将有多个使用者,并且我们希望给定的uid始终指向同一个使用者。此问题和答案是我当前正在查找的内容:。我们的想法是加载带有散列键范围的流描述,md5是uid,并将其与这些范围进行比较,以确定它最终会出现在哪个碎片中。您这里有两个问题还是只有一个问题?你能澄清你的确切要求吗?