我有一个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监控显示这有时是我的实际吞吐量。它在其他时间显示较低的值,但这绝不会低于几百。
为何如此巨大的差异?我应该如何根据我尝试写入表格的数据量/数量来计算我需要的吞吐量?
答案 0 :(得分:0)
您已创建一个表格:
我认为您只想通过哈希或仅通过全局索引进行查询。这是对的吗?
你真的想要全球指数吗?
是否可以通过散列或散列+范围进行查询?
答案 1 :(得分:0)
事实证明我没有正确计算所需的吞吐量:它不仅仅基于书面项目的数量,而是基于它们的大小。每秒一个写入单位用于1Kb数据。因此,尺寸为2Kb的物品需要两倍于1Kb物品的吞吐量。我的大多数物品都比1Kb大很多。