【发布时间】:2020-09-05 22:53:11
【问题描述】:
在过去的 48 小时里,我一直在为这个问题苦苦挣扎,在阅读了这里的大量答案、博客、文章、文档等之后......我仍然找不到解决方案!
基本上,我有一个 2 分钟超时的 lambda 函数。根据日志和见解,它可以很好地处理大多数请求,但在尝试执行以下事务时会随机失败并出现“超时”错误。
Lambda 代码(为了便于阅读而截断):
import pgp from 'pg-promise'
import logger from '../lib/logger'
const Database = pgp()
const db = Database({
connectionString: process.env.DATABASE_URL,
max: 3,
idleTimeoutMillis: 10000,
})
db.connect()
.then(() => logger.info('Successfully connected to the PG database'))
.catch(err => logger.error({ err }))
export const handler = async (event, context) => {
logger.info('transaction start...')
await db.tx(async tx => {
await tx.none(
`
INSERT INTO...`,
[someValue1, someValue2]
)
const updatedRow = await tx.one(
`
UPDATE Something...`,
[somethingId]
)
return someFunction(updatedRow)
})
logger.info('transaction end...')
}
const someFunction = async (data) => {
return db.task('someTask', async ctx => {
const value = await ctx.oneOrNone(
`SELECT * FROM Something...`,
[data.id]
)
if (!value) {
return
}
const doStuff = async (points) =>
ctx.none(
`UPDATE Something WHERE id =.....`,
[points]
)
// increment points x miles
if (data.condition1) {
await doStuff(10)
}
if (data.condition2) {
await doStuff(20)
}
if (data.condition3) {
await doStuff(30)
}
})
}
我看到事务开始但永远不会结束,所以函数不可避免地被超时杀死。
我阅读了pg-promise 中的整个 wiki,并了解了有关调整、性能、良好做法等的所有内容。但仍然有一些非常错误的地方。
您可以看到,我还更改了池大小和最大超时时间以进行试验,但这并没有解决问题。
有什么想法吗?
谢谢!
【问题讨论】:
标签: node.js lambda timeout pg-promise