要将 brotli 压缩与 GCP 云函数一起使用,您必须使用 onRequest
公开快速响应的函数类型,您可以在其中更改响应标头。
import * as functions from "firebase-functions";
import * as zlib from "zlib";
const runTest = functions
.https.onRequest(async (request, response) => {
// Allowing CORS on my function
response.set('Access-Control-Allow-Origin', "*")
zlib.brotliCompress(JSON.stringify({something: "this is test"}), ((error, result) => {
if(error){
console.error("Error", error)
response.status(500).end()
}
response.set("content-encoding", "br")
response.send(result);
}))
}
export { runTest };
我从 gzip 的 50kB 到 brotli 的 20kB。
但是,您还必须考虑其他问题。 Brotli 压缩对 CPU 的压缩要求更高。有不同的压缩选项,您可以考虑根据数据大小更改它们。我还没有和他们一起玩。我们也可以流式传输数据?对 express 框架进行一些调整。
编辑:
这是我的流实现,为我的用例调整了参数。
我的响应时间值与 gzip 相同,CF 性能相同,传输大小减少 40%。 (仅供参考:在调整参数之前,我的响应时间确实很慢,我认为 BROTLI_MODE_TEXT 帮助很大!)
import * as stream from "stream";
const stringifiedData = JSON.stringify(inputData);
const inputStream = new stream.Readable(); // Create the stream
inputStream.push(stringifiedData); // Push the data
inputStream.push(null); // End the stream data
const passTrough = new stream.PassThrough()
const brotli = zlib.createBrotliCompress( {
chunkSize: 32 * 1024,
params: {
[zlib.constants.BROTLI_PARAM_MODE]: zlib.constants.BROTLI_MODE_TEXT,
[zlib.constants.BROTLI_PARAM_QUALITY]: 4,
[zlib.constants.BROTLI_PARAM_SIZE_HINT]: stringifiedData.length
}});
inputStream.pipe(brotli).pipe(passTrough)
passTrough.on('data', (data) => {
response.write(data);
})
passTrough.on('end', () => {
response.end();
})