我正在使用一个基于nodejs的服务器,它从s3下载1000个pdf文件,每个9 MB,压缩成zip文件,并返回URL。
但是,从S3下载时出现问题。当我开始在S3上下载时,大约下载了100个下载,然后无法连接互联网。看起来它不相关的大小,因为它是成功的,当尝试与5个文件与1GB的文件。
这会导致mysql连接丢失> transaction fail [ERROR] Error: BEGIN; - Can't add new command when connection is in closed state
lost connection
我怀疑繁重的网络操作不应该放在promise.all()中,但我不知道确切的原因。救命啊!救命啊!
await Promise.all(
Ids.map((id) => {
const readablePayloads: Array<{ filename: string; bugffer: Readable; }> = [];
// get key, bucket by id
const buffer = await S3Helper.getReadable({bucket, key} {accessKeyId, secretAccessKey});
readablePayloads.push({ filename, buffer });
})
)
static async getReadable(opts: { bucket: string; key: string }, awsOpts: AwsOptions): Promise<Readable> {
return (await createS3Client(awsOpts).send(new AWS.GetObjectCommand({ Bucket: opts.bucket, Key: opts.key }))).Body as Readable;
}
可以肯定的是,这段代码工作的连接数不到100个
1条答案
按热度按时间klsxnrf11#
我认为这个问题的几个可能原因:
任何打开的连接都使用文件描述符。Linux默认的每个进程的文件描述符限制是1024。因此,除了分叉你的node.js进程或增加限制之外,你对此无能为力。不推荐后者,除非你有很好的理由。另一种方法是限制连接的数量,我将在下面介绍。
这一点可能性较小,但仍然:每个打开的连接使用一定量的存储器。此外,根据您编写代码和处理可读流的方式,您可能会在可读流中使用过多的缓冲甚至内存泄漏。
限制连接数
以较小的组下载文件,而不是一次全部下载。它可能看起来像这样: