Skip to content
Santekno.com | Level Up Your Engineering Skills
ID
📖 0%
07 Jul 2025 · 3 mnt baca ·Artikel 29 / 110
Go

29 Studi Kasus: Streaming Upload File

IH
Ihsan Arif
Penulis di Santekno · Backend Engineer

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

MERMAID
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

proto
 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

go
 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

go
 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

ParameterBuffer UploadgRPC Streaming
Memory UsageTinggi (file tersimpan di memori)Stabil (per chunk)
Time to WriteSetelah semua data diterimaSegera selama upload
SkalabilitasBurukBaik (support paralel)
KompleksitasRendahMenengah

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! 🚀

Artikel Terkait

💬 Komentar