Heim > Backend-Entwicklung > Golang > Bewältigen Sie S3-Datei-Downloads, ohne dass Ihnen die Ressourcen ausgehen

Bewältigen Sie S3-Datei-Downloads, ohne dass Ihnen die Ressourcen ausgehen

WBOY
Freigeben: 2024-02-10 19:36:09
nach vorne
986 Leute haben es durchsucht

处理 S3 文件下载而不耗尽资源

php-Editor Xinyi ist hier, um eine effiziente Möglichkeit zum Herunterladen von S3-Dateien vorzustellen, um eine Erschöpfung der Serverressourcen zu vermeiden. S3 ist ein skalierbarer Cloud-Speicherdienst von Amazon, aber bei großen Dateidownloads können herkömmliche Downloadmethoden dazu führen, dass die Serverressourcen erschöpft sind. In diesem Artikel wird eine PHP-basierte Lösung vorgestellt, die das Herunterladen von S3-Dateien effektiv verarbeitet und die Serverleistung und Benutzererfahrung durch geblockte Downloads und Streaming verbessert. Lassen Sie uns gemeinsam etwas über diese Methode lernen!

Frageninhalt

Ich habe eine Go-Gin-Anwendung, die das Hoch- und Herunterladen mehrerer Dateitypen in S3 ermöglicht.

Alle Dateien werden vor dem Hochladen auf s3 mit AWS s3cryptoclient, AES GCM und Schlüsseln von KMS verschlüsselt. Was den S3-Bucket betrifft, ist also alles binär.

Ich kann den getObject SDK-Befehl verwenden, um die Datei auf den Server herunterzuladen und zu entschlüsseln, und dann io.write(tempfile) verwenden, um diese Datei dem Client zum Herunterladen bereitzustellen.

Das Problem hierbei ist, dass S3 Dateien mit einer Größe von 10 GB enthält und täglich mehrere Benutzer auf den Server zugreifen. Wie wir gesehen haben, kann das Schreiben temporärer Dateien auf einem Server mit 16 GB RAM auch schnell den Speicher erschöpfen, wobei wir auch die Kosten berücksichtigen, die für den Betrieb eines solchen Servers anfallen.

Der Flaschenhals besteht darin, dass die Datei entschlüsselt werden muss, bevor sie bereitgestellt werden kann. In diesem Anwendungsfall reicht die vorsignierte S3-URL aus, obwohl die Entschlüsselung nicht durch die vorsignierte S3-URL bereitgestellt wird, es sei denn, es handelt sich um die vom Kunden vorgenommene Verschlüsselung In unserem Fall wird AWS Encryption verarbeitet, daher ist diese Lösung nicht realisierbar.

Hat jemand Tipps oder mögliche Anwendungsfälle zur Lösung dieses Problems, bei dem wir go-gin/NGINX verwenden können, um Dateien direkt auf den Client zu schreiben?

Die Verarbeitung von Dateidownloads durch den aktuellen Benutzer

s3FileStream, _ := s3c.GetBucketItem(&utils.S3ObjectBucketInput{
    Bucket: "bucketName",
    Key:    "UserFileName"
})

fileBody, err := io.ReadAll(s3FileStream.Body)
if err != nil {
    panic(err.Error())
}

fileExtension := s3FileStream.Metadata["X-Amz-Meta-Type"]

err = ioutil.WriteFile("file" + *fileExtension, fileBody, 600) // temp file
if err != nil {
    panic(err.Error())
}
c.JSON(http.StatusCreated, string(fileBody))
c.Done()
Nach dem Login kopieren

}

Workaround

Eine Möglichkeit besteht darin, das Objekt direkt als Antworttext an den Client zu schreiben:

s3FileStream, _ := s3c.GetBucketItem(&utils.S3ObjectBucketInput{
    Bucket: "bucketName",
    Key:    "UserFileName",
})
fileExtension := s3FileStream.Metadata["X-Amz-Meta-Type"]
c.DataFromReader(http.StatusCreated, 0, "application/data",
    s3FileStream.Body,
    map[string]string{"Content-Dispositon": "attachment; filename=" + "file" + *fileExtension})
c.Done()
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonBewältigen Sie S3-Datei-Downloads, ohne dass Ihnen die Ressourcen ausgehen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage