我将S3用作数据湖,并在我的打字稿项目中创建了一个S3类,该类管理对我感兴趣的存储桶的访问。
到目前为止,我仅实现了一种方法来检查存储桶中是否存在密钥,并且在密钥正常运行时,我注意到它在运行几次后变得越来越慢。
这是微服务的一部分,该微服务不时保持运行状态,需要检查存储桶中是否存在密钥。该类的代码如下:
import { AWSError, S3 } from "aws-sdk";
import { getJsonConfig, DatalakeConfig } from "./config";
export class S3Client {
private config: DatalakeConfig;
private innerClient: S3;
public constructor(config: string | DatalakeConfig) {
if (typeof config === "string") {
this.config = getJsonConfig("datalake.reader");
} else {
this.config = config;
}
this.innerClient = new S3({
accessKeyId: this.config.accessKeyId,
secretAccessKey: this.config.secretAccessKey
});
}
private withPrefix(path: string): string {
let result = this.config.bucketPath;
if (!result.endsWith('/')) {
result += "/";
}
if (path.includes(result)) {
return path;
}
return result + path;
}
public async keyExists(key: string): Promise<boolean> {
const params = {
Bucket: this.config.bucketName,
Key: this.withPrefix(key)
};
return new Promise<boolean>( (resolve, reject) => {
this.innerClient.headObject(params, (err: AWSError) => {
if (err) {
if (err.code === "NotFound") {
resolve(false);
} else {
reject(err);
}
} else {
resolve(true);
}
});
});
}
}
如您所见,它具有一个innerClient,它是在实例化该类时创建的S3客户端。我现在正按如下方式使用它:
if (!exists) {
reject(Error(`Key not found in the datalake:
Bucket: ${this.datalakeConfig.bucketName}
BucketPath: ${this.datalakeConfig.bucketPath}
Key: ${key}`));
}
使用指数退避方法重试这段代码,直到尝试了给定的次数为止。在测量每次迭代中调用它所花费的时间时,我注意到一段时间后,它花费的时间要长得多。就像随着时间的流逝,请求和连接的速度变慢了。
我不确定在这之间是否应该处理任何事情,或者我有什么需要解决的问题。您在此实现中看到任何需要修改或改进的东西吗?