postgresql - 处理来自 kinesis 的事件时出现奇怪的问题
问题描述
我在 aws 上设置了 amazon connect,如果我进行测试调用,它会将该调用放入 aws kinesis 流中。我正在尝试编写一个处理这些记录并将它们保存到数据库的 lambda。如果我打一个简单的电话(拨打号码 - asnwer - hangup),它工作得很好。但是,如果我进行多部分呼叫(呼叫一个号码 - 接听 - 转移到另一个号码 - 挂断),这会作为两个单独的记录 (CTR) 出现在 kinesis 中。我的 lambda 会一一处理 CTR(联系跟踪记录)。首先,它将 CTR 保存到名为 call_segments 的表中,然后查询该表以查看该调用的其他部分是否已经存在。如果是,则合并数据并保存到名为 completed_calls 的表中,否则跳过它。如果一个呼叫有多个段(如果它被转移到另一个号码),它会将它作为两个事件带给您。
这是我的代码:
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);
};
解决方案
推荐阅读
- javascript - 浏览器中 JavaScript 模块的意义何在?
- macos - 使数字键盘在 macOS 上用作箭头键的标准(无第三方)方法(Xcode?hidutil?)
- javascript - Prisma 抛出错误“TypeError: cannot read property findmany of undefined”
- scalardb - ScalarDB 何时以及为何抛出 UnknownTransactionStatusException
- android - Flutter:同步联系人的最佳方式
- node.js - 如何结束一个永远不会结束的 request.js ServerResponse 流
- html - 当我将其中的锚标记的位置从 div 内部移动到 div 外部时,CSS div 元素变得狭窄
- powerbi - Power BI 钻取功能未过滤矩阵表
- javascript - Prev 和 Next 按钮在断点处无法正常工作
- sql - 寻找在多家商店购物的顾客