javascript - 是否可以使用 node js 从一个谷歌存储桶到另一个存储桶
问题描述
最近我需要从一个 gcp 存储桶中选择一组文件,对其进行压缩并将其放入另一个存储桶。这是为了使 zip 文件可供我系统的用户使用。我知道我们可以像从存储桶中下载必要的文件制作一个 zip 文件并重新上传到下一个存储桶。但是,如果请求数量随着时间的推移而增加,那会使我的服务器不堪重负。那么有没有办法在桶本身上执行此操作并将其移动到下一个桶..?我正在使用 Node.js。
解决方案
简短的回答是不,没有办法将对象从存储桶压缩到目标存储桶
然而,有一种优雅的方式可以自行完成,需要三个组件:(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
推荐阅读
- android - 当数据准备好时,FragmentPagerAdapter 将对象列表传递给片段
- c - 在 C 中打开文件以进行读取
- java - java : 使用缓冲输入流是否使输入流到字节 [] 的转换更有效?
- powershell - Robocopy 文件到随机命名文件夹
- ios - 自定义重置根 ViewController segue 不显示正确的导航栏标题和按钮
- excel - 在预定义的位置创建数据透视表
- xslt - 如何使用 XSLT 在 toc.ncx 中添加 playOrder?
- reactjs - Recaptcha 缺少必需的参数:sitekey
- javascript - 在最终形式重新初始化时保留脏表单值
- typescript - 如何遍历firebase中的子记录?