dynamodb2批次的开始和结束在哪里?

时间:2014-03-04 20:43:31

标签: python batch-processing amazon-dynamodb

我正在尝试将我的python代码从使用dynamodb移动到dynamodb2以访问全局二级索引功能。与ddb2相比,ddbddb相比,一个概念不太明确。这是我的新代码的一个版本,它基本上是从我原来的item_pIds = [] batch = table.batch_write() count = 0 while True: m = inq.read() count = count + 1 mStr = json.dumps(m) pid = m['primaryId'] if pid in item_pIds: print "pid=%d already exists in the batch, ignoring" % pid continue item_pIds.append(pid) sid = m['secondaryId'] item_data = {"primaryId" : pid, "secondaryId"] : sid, "message"] : mStr} batch.put_item(data=item_data) if count >= 25: batch = table.batch_write() count = 0 item_pIds = [] 代码修改的:

primaryId

所以我在这里做的是从队列中获取(JSON)消息。每封邮件都有secondaryIdsecondaryIdprimaryId并不是唯一的,因为我可能会在同一时间收到几条消息。 primaryId有点独特。也就是说,如果我在同一时间得到一组具有相同primaryId的消息,那就很糟糕了。但是,有时候,我会在几个小时内收到一条消息,要求覆盖具有相同dynamodb2的现有消息。所以这似乎与ddb documentation pagewith table.batch_write() as batch: while True: m = inq.read() mStr = json.dumps(m) pid = m['primaryId'] sid = m['secondaryId'] item_data = {"primaryId" : pid, "secondaryId"] : sid, "message"] : mStr} batch.put_item(data=item_data) 类似的陈述很好地吻合:

  

DynamoDB的最大批量大小为每个请求25个项目。如果您尝试放置/删除更多,则上下文管理器将批量尽可能多地批量处理该数字,然后将其刷新到DynamoDB并在更多呼叫进入时继续批处理

然而,我注意到的是,我通过队列获得的大量消息从未进入数据库。也就是说,当我稍后尝试检索它们时,它们就不存在了。所以我被告知更好的处理批量写入的方法是做这样的事情:

batch_write()

也就是说,我只调用primaryId一次,类似于我只打开一次文件,然后连续写入文件。但在这种情况下,我不明白“25最大规则”是什么意思。批次何时开始和结束?我如何检查重复的{{1}}?也就是说,记住我通过队列收到的所有消息是不现实的,因为(i)我有太多这些消息(系统全天候运行)和(ii)如前所述,偶尔重复的ids都可以。

抱歉这条长信息。

1 个答案:

答案 0 :(得分:0)

批次将在发送请求时启动,并在批次中的最后一个请求完成时结束。

与任何RESTful API一样,每个请求都附带 cost ,表示完成所述请求需要多少/多少资源。使用DynamoDB2中的batch_write()类,它们包装组中的请求并创建队列来处理它们,这将降低成本,因为它们不是更长的个人要求。

batch_write()类返回一个处理单个请求的上下文管理器,您返回的内容略微类似于Table个对象,但只有put_itemdelete_item个请求。

DynamoDB的最大批量大小为25,就像你读过的那样。来自source code

中的评论
  

DynamoDB的最大批量大小为每个请求25个项目。如果你尝试   要放/删除更多,上下文管理器将批量多次   因为它可以达到这个数字,然后将它们刷新到DynamoDB&继续   随着更多电话的进入而进行批处理。

您还可以阅读有关从DynamoDB迁移到DynamoDB2 here的特定批次的信息。