处理运动学事件时出现奇怪的问题

时间:2019-04-18 18:35:20

标签: postgresql aws-lambda amazon-kinesis amazon-connect

我在aws上设置了Amazon connect,如果我进行测试调用,它将把该调用放入aws运动学流中。我正在尝试编写一个lambda来处理该记录并将其保存到数据库。 如果我打一个简单的电话(拨打号码-接听电话-挂断电话),则可以正常工作。但是,如果我进行多部分呼叫(呼叫一个号码-应答-转移到另一个号码-挂断),则这成为两个单独的记录(CTR)。 我的lambda一张一张地处理CTR(联系跟踪记录)。首先,它将CTR保存到名为call_segments的表中,然后查询该表以查看此调用的其他部分是否已经存在。如果是,它将合并数据并保存到名为completed_calls的表中,否则将其跳过。 如果一个呼叫超过了段(如果已转移到另一个号码),则将它作为两个事件带给您。 我的问题是,即使我一个接一个地处理这些事件,似乎在处理第二个事件时(从技术上讲,第一个事件的调用段已经在数据库中),它看不到调用的第一段。 / p>

这是我的代码:

const callRecordService = require("./call-records-service");
exports.handler = async (event) => {
await Promise.all(
    event.Records.map(async (record) => {
        return processRecord(record);
    })
);
};
const processRecord = async function(record)        {
    try{
        const payloadStr = new Buffer(record.kinesis.data, "base64").toString("ascii");
        let payload = JSON.parse(payloadStr);
    await     callRecordService.processCTR(payload);
}
catch(err){
    // console.error(err);
}
};

这是服务文件:

async function processCTR(ctr) {
let userId = "12"
let result = await saveCtrToContactDetails(ctr, userId);
    let paramsForCallSegments = [ctr.InstanceARN.split("instance/").pop(), ctr.ContactId]
    let currentCallSegements = await dbHelper.getAll(dbQueries.getAllCallSegmentsQuery, paramsForCallSegments)
    let completedCall = checkIfCallIsComplete(currentCallSegements);
    if (completedCall) {
        console.log('call is complete')
       let results = await saveCallToCompletedCalls(completedCall);
    }
}

//------------- Private functions --------------------
const saveCtrToContactDetails = async (ctr, userId) => {
let params = [ctr.ContactId,userId,ctr.callDuration];
let results = await dbHelper.executeQuery(dbQueries.getInsertCallDetailsRecordsQuery, params);
return results;
}

const checkIfCallIsComplete = (currentCallSegements) => {
   //This function checks if all callSegments are already in call_segments table.

}

const saveCallToCompletedCalls = async (completedCall) => {
    let contact_id = completedCall[0].contact_id;
    let user_id = completedCall[0].user_id;
    let call_duration = completedCall[0] + completedCall[1]
    completedCall.forEach(callSegment => {
        call_duration += callSegment.call_duration;
});
let params = [contact_id, user_id, call_duration];
let results = await dbHelper.executeQuery(dbQueries.getInsertToCompletedCallQuery, params);
};

0 个答案:

没有答案