在Kinesis流上写入数据时,我们遇到了ProvisionedThroughputExceededException问题。
案例1: 我们使用单个m4.4xlarge(16核,64GB内存)实例来写入来自Jmeter的流传递3k请求数据,EC2实例每秒为我们提供1100个请求,因此我们选择2个分片流(即2000 eps)。 结果我们能够成功地在流上写入数据而没有任何损失。
案例2: 为了进一步测试,我们创建了10个EC2 m4.4xlarge(16核,64GB内存)集群和11个分片流(基于一个分片的简单计算1000eps,因此10个分片+ 1个规定)。 当我们测试具有来自Jmeter的不同请求情况的EC2集群时,例如3,10,30万。我们在日志文件中收到ProvisionedThroughputExceededException错误。
在Jmeter侧,EC2群集为我们提供了7500eps,我相信7500eps流量为11000eps的容量不应该返回这样的错误。
你能帮我理解这个问题背后的原因。
答案 0 :(得分:1)
听起来Kinesis并没有在您的分片中均匀地散布/分发您的数据 - 有些是热的" (获得ProvisionedThroughputExceededException
),而其他人则感到寒冷"。
要解决此问题,我建议
ExplicitHashKey
参数可以控制数据进入的分片。 PutRecords documentation有一些关于此的基本信息(但没有它应该的那么多)。 最简单的模式就是为每个分片设置一个预定义的ExplicitHashKey,并让PutRecords逻辑为每个记录迭代它 - 完全均匀分布。在任何情况下,请确保您的记录哈希算法将记录均匀分布在分片中。
基于使用ExplicitHashKey的另一个替代/扩展是让您的哈希空间的子集专用于" overflow" shard(s) - 在您的情况下,1个特定的ExplicitHashKey值映射到一个分片 - 当您开始在普通分片上受到限制时,将记录发送到那里进行重试。
答案 1 :(得分:0)
检查您的制作人,您确定要将数据插入到不同的分片中吗? PutRecordRequest调用中的“PartitionKey”值可能对您有帮助。
答案 2 :(得分:0)
我认为您需要传递不同的“分区键”以供记录在不同“碎片”之间共享数据。 即使您已经创建了多个分片,并且所有记录都使用相同的分区键,但您仍在写入单个分片,因为它们都具有相同的哈希值。在PartitionKey
处查看更多内容