为什么我的dynamodb吞吐量如此之高?

时间:2014-03-21 18:59:35

标签: python multiprocessing amazon-dynamodb throughput

我有一个python脚本从队列中读取JSON消息,并将这些消息写入DynamoDB表。每条消息都有一个主ID和一个辅助ID,我使用一个带GSI的表来索引消息。

所以我假设我正在从队列收到的每个JSON消息中写一个DynamoDB项。这是代码的简化版本(我正在使用dynamodb2

i = 0
with table.batch_write() as batch:
    while True:
         m = inq.read()
         i = i + 1
         mStr = json.dumps(m)
         pid = m['primaryId']
         sid = m['secondaryId']
         item_data = {"primaryId" : pid, "secondaryId"] : sid, "message"] : mStr}
         batch.put_item(data=item_data)

         if i == 25:
             batch.resend_unprocessed()
             i = 0

这是创建表的块

table = Table.create(   tName,
            schema=[HashKey('primaryId')],
            throughput={    'read': 5,
                    'write': 1000},
            global_indexes=[
                GlobalAllIndex('secIdIndex',
                        parts=[HashKey('secondaryId')],
                        throughput={
                            'read': 5,
                            'write': 1000})],
            connection=conn)

一个重要的警告:使用multiprocessing库,我启动了10个相同的编写器脚本副本。脚本的每个副本都从同一队列中读取,并且它们都同时写入同一个表。这样做是为了跟上流经输入队列的数据量,因为在将该消息以其原始形式写入表中之前,我还必须处理每条消息。我没有在这里包含脚本的处理部分,因为它不相关。

我收集了一些统计信息,看起来我通过输入队列每秒收到大约 150 个JSON消息。 10个编写器工作程序中的每一个都占其中的十分之一,因此每个编写器每秒将大约15条消息写入DynamoDB表中。所以我希望我的预配置写入吞吐量应该是150左右。但是,目前它处于 1000 ,因为AWS监控显示这有时是我的实际吞吐量。它在其他时间显示较低的值,但这绝不会低于几百。

为何如此巨大的差异?我应该如何根据我尝试写入表格的数据量/数量来计算我需要的吞吐量?

2 个答案:

答案 0 :(得分:0)

您已创建一个表格:

  • 哈希键:它是主索引,用于定义表的分区。
  • 全局索引:仅在您希望按此索引搜索时才有用,除了哈希。这意味着大量的资源消耗。

我认为您只想通过哈希或仅通过全局索引进行查询。这是对的吗?

你真的想要全球指数吗?

是否可以通过散列或散列+范围进行查询?

答案 1 :(得分:0)

事实证明我没有正确计算所需的吞吐量:它不仅仅基于书面项目的数量,而是基于它们的大小。每秒一个写入单位用于1Kb数据。因此,尺寸为2Kb的物品需要两倍于1Kb物品的吞吐量。我的大多数物品都比1Kb大很多。