AWS Kinesis 的吞吐量低

3
我使用Python的boto.kinesis模块将记录写入AWS Kinesis。达到的最大吞吐量约为40个puts/秒。然而,根据Kinesis FAQ

每个分片最多支持1000个PUT记录/秒。

因此,我的当前方法仅达到理论可能性的4%,这似乎非常低。
有没有人有想法如何提高吞吐量?
设置:Kinesis Stream是一个具有一个分片的实例。生产者位于专用的AWS EC2实例(t3.medium),位于与Kinesis Stream相同的区域。它创建大约20个字符长度的字符串,并通过boto.kinesis.Connection.put_record(“my_stream”,my_message)将它们发送到Kinesis Stream。
简化代码:
from boto import kinesis
import time

connection = kinesis.connect_to_region(REGION)
stream = connection.create_stream("my_stream", shard_count=1)
time.sleep(60)  # wait a minute until stream is created

for i in range(NUM_MESSAGES): 
    my_message = "This is message %d" % i
    connection.put_record(my_message, "my_stream", "partition_key")

1
你尝试过使用批量方法"put_records"吗?每次HTTP调用服务都涉及大量开销,因此每次调用尽可能多的数据将有助于提高吞吐量。另外,你是在同一地区的EC2实例中进行加载吗?这也会有所帮助。 - garnaat
@garnaat:是的,我将它们批量发送,每次通过connection.put_records(message_list, "my_stream")发送100条消息,使用message_list.append({'Data': my_message, 'PartitionKey': str(i)})。然而,吞吐量甚至下降到30个put/sec。 - Thomas Schreiter
你的意思是每秒钟30次100条记录的输出吗? - garnaat
1
我在我的代码中发现了一个错误。修复后,消息现在真的被批量处理在一起了。结果:每秒17个puts,即每秒1700个消息。这样更有意义。感谢你的帮助@garnaat。 - Thomas Schreiter
你能分享一下是什么 bug 吗?或者更新一下问题中的代码。这对读者会很有帮助! - nitinr708
1个回答

2

我尝试过了,但吞吐量下降了。(请参见 OP 中的评论)。 - Thomas Schreiter
我在我的代码中修复了一个错误,吞吐量现在达到了1700条/秒。你的建议绝对正确。谢谢。(请查看我的评论) - Thomas Schreiter
太棒了。很高兴我能帮忙。 - Mircea
我们使用Fluentd来捕获、聚合和推送事件到Kinesis。 - vmax33

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