【问题标题】:Dynamodb - batchWrite not working(nodejs)Dynamodb - batchWrite 不工作(nodejs)
【发布时间】:2020-12-09 10:55:23
【问题描述】:

我正在使用 lambda、API 网关和 dynamodb

我正在创建一个 batchWrite 函数,以便在一个函数中上传超过 25 个项目。

但我发现当我上传 35 个项目时, 前 25 个项目成功上传到 dynamodb,但后 10 个项目失败但没有记录错误。

函数是用node.js写的

'use strict'
const AWS = require('aws-sdk');
const sha1 = require('sha1');
const documentClient = new AWS.DynamoDB.DocumentClient();

exports.handler = async function (event, context, callback) {

    let responseBody = "";
    let statusCode = 0;

    const { excelObject } = JSON.parse(event.body);

    if(excelObject){
        await uploadFileByBatch(excelObject)
    }

    const response = {
        statusCode: statusCode,
        headers:{
            "Content-Type": "application/json",
            "access-control-allow-origin": "*"
        },
        body: responseBody
    }

    console.log(response)
    return response
}

let uploadFileByBatch = async function (payload) {

    var items = [];
    var params={};

    if(payload.length > 25){
        console.log("> 25")
        let newObj = payload.slice(0,25)
        payload.splice(0,25)

        console.log("new Payload length")
        console.log(payload.length)

        newObj.forEach(obj =>{
            let hash = sha1(Buffer.from(new Date().toString()+ Math.random()));
            items.push(
                {
                    PutRequest:{
                        Item: {
                            id: obj.id?obj.id:hash,
                            organization_EN: obj.organization_EN,
                            email: obj.email,
                            isActive: obj.isActive
                        }
                    }
                }
            )
        })

        params = {
            RequestItems:{
                "Community": items
            }
        }
        console.log(params)
        try{
            const data = await documentClient.batchWrite(params).promise();
        }catch(err){
            console.log(err)
        }
        uploadFileByBatch(payload)
    }else{
        console.log("less than 25")
        payload.forEach(obj =>{
            let hash = sha1(Buffer.from(new Date().toString()+ Math.random()));
            items.push(
                {
                    PutRequest:{
                        Item: {
                            id: obj.id?obj.id:hash,
                            organization_EN: obj.organization_EN,
                            email: obj.email,
                            isActive: obj.isActive
                        }
                    }
                }
            )
        })
        params = {
            RequestItems:{
                "Community": items
            }
        }
        console.log(params)
        try{
            console.log("first BatchWrite")
            const data = await documentClient.batchWrite(params).promise();
            console.log("first Data")
        }catch(err){
            console.log(err)
        }
    }

}

日志如下。

>25
New Payload length
10

{
  RequestItems: {
    'Community': [
      [Object], [Object], [Object],
      [Object], [Object], [Object],
      [Object], [Object], [Object],
      [Object], [Object], [Object],
      [Object], [Object], [Object],
      [Object], [Object], [Object],
      [Object], [Object], [Object],
      [Object], [Object], [Object],
      [Object]
    ]
  }
}

first BatchWrite
Less than 25
{
  RequestItems: {
    'Community': [
      [Object], [Object],
      [Object], [Object],
      [Object], [Object],
      [Object], [Object],
      [Object], [Object]
    ]
  }
}

{
  statusCode: 0,
  headers: {
    'Content-Type': 'application/json',
    'access-control-allow-origin': '*'
  },
  body: ''
}

【问题讨论】:

    标签: node.js amazon-web-services aws-lambda amazon-dynamodb


    【解决方案1】:

    在一个使用 DynamoDB 的 batchWrite 函数请求中,您不能上传超过 25 个

    如果以下一项或多项为真,则 DynamoDB 拒绝整个批量写入操作:

    • BatchWriteItem 请求中指定的一个或多个表不存在。
    • 在请求中为项目指定的主键属性与对应表的主键架构中的主键属性不匹配。
    • 您尝试在同一个 BatchWriteItem 请求中对同一个项目执行多个操作。例如,您不能在同一个 BatchWriteItem 请求中放置和删除同一个项目。
    • 您的请求至少包含两个具有相同哈希和范围键的项目(本质上是两个 put 操作)。
    • 批处理中有超过 25 个请求。
    • 批次中的任何单个项目超过 400 KB。
    • 总请求大小超过 16 MB。

    您可以在此处检索有关此的信息 https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchWriteItem.html

    有一些方法可以处理大批量操作,你可以做 25 的并行请求,但你应该小心它。

    【讨论】:

    • 我把这35条分成2批上传,这样也不行吧?
    • 是的,通常我更喜欢做 25,然后是 25,然后是 25 等等。而不是并行。因为让我们说一个并行的崩溃,你不能真正重试你所在的位置。如果你在崩溃时一个接一个地做,你可以用失败的 id 重试
    • 所以如果我上传 100 个项目,我可以在前端发送 4 个请求。是你的意思吗?
    • 是的。这样,如果一个批次失败,您可以从失败的那个重新开始该过程。重试(无论是否更新数据)
    猜你喜欢
    • 1970-01-01
    • 2017-08-12
    • 2021-07-02
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    相关资源
    最近更新 更多