【发布时间】:2021-03-20 12:52:11
【问题描述】:
我正在尝试将 json 对象(序列化为字符串)发送到触发 lambda 的 SQS 队列中。 SQS 消息超出了 SQS 的最大 256 kB 限制。我试图在发送之前对我的消息进行 gzip 压缩。以下是我的尝试:
public static String compress(String str) throws Exception {
System.out.println("Original String Length : " + str.length());
ByteArrayOutputStream obj=new ByteArrayOutputStream();
GZIPOutputStream gzip = new GZIPOutputStream(obj);
gzip.write(str.getBytes("UTF-8"));
gzip.close();
String base64Encoded = Base64.getEncoder().encodeToString(obj.toByteArray());
System.out.println("Compressed String length : " + base64Encoded.length());
return base64Encoded;
}
此 SQS 队列触发的 lambda 是基于 nodejs 的 lambda,我需要在其中解压缩和解码此消息。我尝试使用 nodejs 中的 zlib 库来解压缩和解码我的消息,如下所示:
exports.handler = async (event, context) => {
let msg = null
event.Records.forEach(record => {
let { body } = record;
var buffer = zlib.inflateSync(new Buffer(body, 'base64')).toString();
msg = JSON.parse(JSON.parse(JSON.stringify(buffer.toString(), undefined, 4)))
});
}
执行时出现以下错误:
{
"errorType": "Error",
"errorMessage": "incorrect header check",
"code": "Z_DATA_ERROR",
"errno": -3,
"stack": [
"Error: incorrect header check",
" at Zlib.zlibOnError [as onerror] (zlib.js:180:17)",
" at processChunkSync (zlib.js:429:12)",
" at zlibBufferSync (zlib.js:166:12)",
" at Object.syncBufferWrapper [as unzipSync] (zlib.js:764:14)",
" at /var/task/index.js:12:19",
" at Array.forEach (<anonymous>)",
" at Runtime.exports.handler (/var/task/index.js:10:17)",
" at Runtime.handleOnce (/var/runtime/Runtime.js:66:25)"
]
}
谁能告诉我如何以更好的方式解决这个问题?有没有更好的方法来压缩java中的字符串?有没有更好的方法来解压、解码和解析nodejs中的json?
【问题讨论】:
-
为什么不将
String存储到S3中,然后在SQS消息中分享URL以供Lambda取货?如果您的消息超出了256KB作为安全墙,这是最好的方法。没有算法可以在 100% 的时间内压缩这么多。建议您在生产环境中设置安全墙,以减轻某些消息(假设 10% 超过 256KB)
标签: java node.js aws-lambda amazon-sqs zlib