是否可以使用Node JS从一个Google存储桶到另一个Google存储桶进行压缩

时间:2019-02-28 12:48:39

标签: javascript node.js google-cloud-platform google-cloud-storage

最近我被要求从一个gcp存储桶中选择一组文件,将其压缩后放到另一个存储桶中。这是为了使zip文件可用于我系统的用户。我知道我们可以像从存储桶中下载必要的文件那样做一个zip,然后重新上传到下一个存储桶中。但是,如果超时增加请求数量,那将使我的服务器不堪重负。那么有没有办法在存储桶本身上执行此操作并将其移至下一个存储桶..?我正在使用Node.js。

1 个答案:

答案 0 :(得分:1)

简短的回答是,无法将对象从存储桶压缩到目标存储桶

不过,有一种优雅的方法可以自行完成,这需要三个组件:(1)GCP发布/订阅主题,(2)节点/request-zip服务和(3)云计算实例组来处理拉链

(1)创建发布订阅主题

gcloud pubsub topics create request-zip
gcloud pubsub subscriptions create --topic request-zip work-zip

(2)创建一个/request-zip服务以发布到request-zip主题

下面的快速配方是伪代码,该伪代码显示了如何接收文件列表并将其排队到request-zip主题上。这个电话很快。您可能想要添加电子邮件地址或创建另一个“完成”队列,以在工作完成时通知呼叫者。

const express = require('express')
const app = express()
const port = 3000
const bodyParser = require('body-parser')
const {PubSub} = require('@google-cloud/pubsub');

app.use(bodyParser.json())
app.post('/request-zip', (req, res) => {


  const pubsub = new PubSub({projectId});

  // send the file list to the queue
  sendMessageResponse = await pubsub.sendMessage("request-zip", req.body.files.join(','));
  console.info(sendMessageResponse)

}
app.listen(port, () => console.log(`Example app listening on port ${port}!`))

示例发布到cli上的主题进行测试


    gcloud pubsub topics publish request-zip --message "file1.txt,file2.png"

(3)运行实例组以工作队列

编写如下所示的简短shell脚本,并启动几个实例来进行压缩

示例接收消息

while true; do
   # i suggest testing success on all routines and then --ack at the end.
   files=$(gcloud pubsub subscriptions pull work-zip --auto-ack --format json|jq -r '. 
   [].message.data'|base64 -d)
   gsutil sync gs://my-bucket/{$files} .
   zip -r archive.zip .
   gsutil sync archive.zip gs://target-bucket/
   rm -rf *
done