29 Studi Kasus: Streaming Upload File
Streaming File Upload dengan Go dan gRPC
Mengunggah file besar adalah tantangan klasik dalam pengembangan backend, terlebih ketika sistem harus mampu menangani ratusan MB atau bahkan GB dalam satu sesi. Bila dilakukan secara konvensional (buffer all then store), risiko overload memory dan kegagalan sangat tinggi. Di sinilah pentingnya pendekatan streaming upload.
Artikel ini akan membahas cara mengimplementasikan streaming file upload menggunakan Go dan gRPC streaming. Kita akan menyimulasikan API upload file besar dari klien ke server, yang ditangani secara chunked.
Kenapa Memilih gRPC Streaming?
Dengan gRPC streaming, kita bisa:
- Mengirim data bertahap dalam bentuk chunk.
- Menghindari memory overuse.
- Memberikan feedback progres upload.
- Mengelola upload file besar secara efisien dan scalable.
Arsitektur dan Alur Streaming Upload
sequenceDiagram
participant Client
participant gRPCServer
participant Disk
Client->>gRPCServer: stream Upload(chunk)
loop Selama upload
gRPCServer->>Disk: write(chunk)
end
gRPCServer-->>Client: UploadResponse(status)
1. Definisi Protobuf
1syntax = "proto3";
2
3package upload;
4
5service FileService {
6 rpc Upload(stream UploadRequest) returns (UploadResponse);
7}
8
9message UploadRequest {
10 bytes chunk = 1;
11 string filename = 2; // hanya dikirim di awal chunk
12}
13
14message UploadResponse {
15 string message = 1;
16 bool success = 2;
17}2. Implementasi Server gRPC di Go
a. Setup Server
1package main
2
3import (
4 "context"
5 "fmt"
6 "io"
7 "log"
8 "os"
9 "google.golang.org/grpc"
10 "net"
11 pb "your_project/proto/upload"
12)
13
14type server struct {
15 pb.UnimplementedFileServiceServer
16}
17
18func (s *server) Upload(stream pb.FileService_UploadServer) error {
19 var file *os.File
20 firstChunk := true
21
22 for {
23 req, err := stream.Recv()
24 if err == io.EOF {
25 return stream.SendAndClose(&pb.UploadResponse{
26 Message: "Upload selesai",
27 Success: true,
28 })
29 }
30 if err != nil {
31 return err
32 }
33
34 if firstChunk {
35 file, err = os.Create("uploads/" + req.Filename)
36 if err != nil {
37 return err
38 }
39 defer file.Close()
40 firstChunk = false
41 }
42
43 _, err = file.Write(req.Chunk)
44 if err != nil {
45 return err
46 }
47 }
48}
49
50func main() {
51 lis, err := net.Listen("tcp", ":50051")
52 if err != nil {
53 log.Fatalf("gagal listen: %v", err)
54 }
55
56 s := grpc.NewServer()
57 pb.RegisterFileServiceServer(s, &server{})
58 log.Println("Server gRPC berjalan di port 50051")
59 s.Serve(lis)
60}3. Simulasi Klien Upload Streaming
1conn, _ := grpc.Dial("localhost:50051", grpc.WithInsecure())
2defer conn.Close()
3
4client := pb.NewFileServiceClient(conn)
5stream, _ := client.Upload(context.Background())
6
7f, _ := os.Open("large.pdf")
8buf := make([]byte, 1024*32) // 32 KB per chunk
9
10stream.Send(&pb.UploadRequest{Filename: "large.pdf"})
11
12for {
13 n, err := f.Read(buf)
14 if err == io.EOF {
15 break
16 }
17 stream.Send(&pb.UploadRequest{Chunk: buf[:n]})
18}
19
20res, _ := stream.CloseAndRecv()
21fmt.Println("Respon server:", res.Message)4. Perbandingan: Buffer vs Streaming
| Parameter | Buffer Upload | gRPC Streaming |
|---|---|---|
| Memory Usage | Tinggi (file tersimpan di memori) | Stabil (per chunk) |
| Time to Write | Setelah semua data diterima | Segera selama upload |
| Skalabilitas | Buruk | Baik (support paralel) |
| Kompleksitas | Rendah | Menengah |
5. Tips Produksi
- ✅ Gunakan validasi ukuran file pada klien dan server.
- ✅ Batasi ukuran chunk dan maksimum file (gunakan metadata).
- ✅ Tambahkan TLS + metadata untuk autentikasi.
- ✅ Stream langsung ke cloud storage (misalnya Google Cloud Storage atau S3) untuk efisiensi.
- ✅ Logging dan tracing sangat membantu debugging.
Kesimpulan
Streaming upload file dengan gRPC di Go memberikan efisiensi tinggi dan kontrol granular terhadap aliran data. Pendekatan ini sangat cocok untuk aplikasi yang melayani file besar, pengguna banyak, atau butuh performa tinggi.
gRPC streaming adalah alat yang powerful jika digunakan dengan benar. Jika arsitektur aplikasi Anda melibatkan upload file besar — sudah waktunya beralih ke pendekatan ini.
Ingin saya bantu setup modul upload file stream dengan validasi metadata dan monitoring Prometheus? Tulis saja! 🚀