tutorial

  1. Load Balancing di gRPC Client

61. Load Balancing di gRPC Client: Memaksimalkan Performa dengan Distribusi Cerdas

Disclaimer: Artikel ini ditulis dari perspektif engineer yang sudah berpengalaman dalam membangun sistem distributed dengan gRPC, dalam konteks development backend berbasis Go. Namun, konsepnya universal, sehingga dapat diterapkan di bahasa lainnya.


Ketika berbicara tentang scalable microservice, gRPC kini sudah jadi de-facto standard untuk komunikasi service-to-service yang efisien. Namun, performa RPC framework yang kencang itu tak akan maksimal tanpa load balancing yang tepat.

Artikel kali ini akan membahas tuntas: Bagaimana sebenarnya load balancing di gRPC client bekerja, bagaimana mengimplementasikannya, serta tips dan best practices-nya. Saya juga akan bahas kode, simulasi load balancing, beserta visualisasi menggunakan Mermaid.js.

1. Mengapa Load Balancing pada gRPC Client?

Secara default, ketika kita membuat gRPC client yang terhubung ke beberapa instance server, maka kita butuh load balancing agar request tidak terpusat hanya pada satu instance.

Tanpa load balancing, bottleneck dan single point of failure (SPOF) sangat mudah terjadi.

Dalam skenario berikut, misal kita punya 3 instance server:

InstanceIP Address
Server 110.0.0.1:50051
Server 210.0.0.2:50051
Server 310.0.0.3:50051

Tanpa load balancing, request dari client bisa berat sebelah: misal semua request nempel ke 10.0.0.1, sementara yang lain idle.

2. Model Load Balancing di gRPC

Ada dua level load balancing pada arsitektur gRPC:

  1. External (Level 4/7):
    • Seperti memakai Nginx/Envoy/HAProxy di depan cluster gRPC server.
    • Pro: Mudah di-manage.
    • Kontra: Menambah latency; tidak tahu state server (difficult to do client-side routing).
  2. Client-side Load Balancing:
    • Logic pembagian request berjalan di client gRPC.
    • Lebih efisien (tidak perlu hop ekstra).
    • Lebih dekat dengan service discovery.

Idealnya, client-side load balancing yang kita pilih.

3. Cara Kerja Load Balancing di gRPC Client

Secara high level, proses request dari gRPC client bisa divisualisasikan sebagai berikut:

flowchart TD
    Client-->|Resolve addresses|Resolver
    Resolver-->|Return Server List|Client
    Client-->|Select Server (Load Balancer)|LoadBalancer
    LoadBalancer-->Server1
    LoadBalancer-->Server2
    LoadBalancer-->Server3

Penjelasan Flow:

  1. Client butuh resolved server addresses dari resolve DNS/Consul/dll.
  2. Load balancer di client memilih (misal: round robin) ke mana permintaan diarahkan.

Tabel Mode Load Balancing Built-in Golang gRPC:

ModeDeskripsi
round_robinDistribusi merata ke semua instance
pick_firstSelalu pilih server pertama (defaul)

4. Implementasi Load Balancer di gRPC Client (Go)

Untuk penggunaan produksi, jangan gunakan mode default pick_first. Kita ingin mode round_robin yang membagi request ke beberapa instance.

Sample Service Protobuf

Misal, service protokol sederhana:

// hello.proto
syntax = "proto3";
service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}
message HelloRequest {
  string name = 1;
}
message HelloReply {
  string message = 1;
}

4.1. Setup gRPC Server Cluster

Jalankan beberapa gRPC server pada port berbeda (misal: 50051, 50052, 50053).

// main.go (server)
lis, err := net.Listen("tcp", fmt.Sprintf(":%d", port)) // port: 50051, dst
grpcServer := grpc.NewServer()
pb.RegisterGreeterServer(grpcServer, &server{})
grpcServer.Serve(lis)

Jalankan server di tiga terminal berbeda, masing-masing menggunakan port berbeda.

4.2. Register dan Implementasi Load Balancer di Client

A. Akses langsung ke banyak address

import (
    "google.golang.org/grpc"
    "google.golang.org/grpc/balancer/roundrobin"
)

var addresses = []string{
    "10.0.0.1:50051",
    "10.0.0.2:50051",
    "10.0.0.3:50051",
}

target := fmt.Sprintf("dns:///%s", strings.Join(addresses, ",")) // DNS resolver
conn, err := grpc.Dial(target, grpc.WithInsecure(),
    grpc.WithDefaultServiceConfig(`{"loadBalancingPolicy": "round_robin"}`),
)

B. Integrasi Service Discovery (Advanced):

Bisa integrasi dengan DNS, Consul, atau custom resolver. Untuk demo, gunakan DNS.

Misal, service kamu terdaftar di DNS SRV record, maka cukup:

conn, err := grpc.Dial(
  "dns:///greeter-service:50051", // <service_dns_name>
  grpc.WithInsecure(),
  grpc.WithDefaultServiceConfig(`{"loadBalancingPolicy": "round_robin"}`),
)

4.3. Panggil RPC (Load Balanced)

client := pb.NewGreeterClient(conn)
resp, err := client.SayHello(context.Background(), &pb.HelloRequest{Name: "gRPC"})

Jika loop beberapa kali (100 call), request akan bergantian ke seluruh server.

4.4. Simulasi dan Visualisasi

Dengan kode berikut, kita bisa lihat distribusi ke server:

for i := 0; i < 10; i++ {
    resp, _ := client.SayHello(context.Background(), &pb.HelloRequest{Name: fmt.Sprintf("Request-%d", i)})
    fmt.Println(resp.Message)
}

Di log setiap server, akan tercetak message yang bergantian masuk – ini bukti round robin berhasil.

5. Simulasi: Akurasi Load Balancer

Misalkan kita panggil 60 request berturut-turut. Dengan 3 server, tiap server harusnya dapat ~20 request jika perfect load balancing.

ServerRequest MasukPresentase
Server 12033.3%
Server 22033.3%
Server 32033.3%

6. Troubleshooting dan Best Practice

Masalah Umum

  1. gRPC Client Stuck ke 1 server
    Cek: load balancer policy sudah di-set?

  2. Failover lambat
    Cek: health check/connection retry diaktifkan di client.

  3. Service tak terdaftar di DNS
    Gunakan custom resolver, atau service registry seperti Consul.

Best Practice

  • Gunakan Provider Balancing Fleksibel: Pilih berdasarkan kebutuhan.
    • Round Robin: Paling common
    • Weighted (custom): Jika ingin pemilihan berdasarkan kemampuan instance.
  • Monitoring! Logging dan metrics distribusi request penting untuk deteksi bottleneck.
  • Health Checking
    Service yang sudah unhealthy jangan dimasukkan ke balancing pool.

7. Kesimpulan

Load balancing di gRPC client adalah aspek yang krusial ketika kamu ingin membangun distributed service yang scalable dan resilient. Client-side load balancing memungkinkan pemanfaatan cluster server secara optimal, meningkatkan throughput, dan mengurangi SPOF.

Sebagai engineer, jangan lupa:

  • Selalu gunakan load balancer di client (mode round_robin);
  • Integrasi dengan service discovery untuk scaling;
  • Lakukan monitoring distribusi traffic secara berkala.

Dengan konfigurasi yang benar, baik Go ataupun platform lain, gRPC + client-side load balancing adalah senjata ampuh untuk mencapai sistem handal di era microservices.


Semoga artikel ini bermanfaat! Kolom komentar terbuka untuk diskusi atau berbagi pengalaman load balancing di production. 🚀

comments powered by Disqus