首页 > 解决方案 > 是否可以使用 node js 从一个谷歌存储桶到另一个存储桶

问题描述

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

标签: javascriptnode.jsgoogle-cloud-platformgoogle-cloud-storage

解决方案


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

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

(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 脚本并启动一些实例来执行 zips

示例接收消息

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

推荐阅读