Gunakan gRPC untuk lalu lintas east-west frekuensi tinggi — panggilan layanan-ke-layanan di dalam cluster yang mencapai lebih dari 1.000 permintaan per menit — di mana penghematan latensi dan bandwidth menghasilkan penghematan biaya infrastruktur yang nyata. Untuk panggilan internal frekuensi rendah, API yang menghadap publik, atau tim tanpa pengalaman gRPC dalam tenggat waktu, REST tetap lebih sederhana dan sama efektifnya.
Studi benchmark 2025 menemukan gRPC memberikan latensi rata-rata 48% lebih rendah untuk payload kecil (di bawah 1 KB), penggunaan CPU 19% lebih rendah, konsumsi memori 34% lebih rendah, dan bandwidth jaringan 41% lebih rendah dibandingkan REST di bawah beban yang setara. Keuntungan ini berasal dari multiplexing HTTP/2 dan serialisasi Protocol Buffers yang menghasilkan pesan biner 3–10x lebih kecil dari JSON yang setara.
Browser tidak mendukung framing HTTP/2 yang dibutuhkan gRPC secara native, sehingga panggilan langsung dari browser ke server gRPC tidak memungkinkan tanpa grpc-web atau proxy transkoding. Itulah mengapa pola yang direkomendasikan adalah menyimpan gRPC untuk service mesh internal di mana Anda mengendalikan kedua ujungnya, dan mengekspos REST atau GraphQL untuk klien eksternal.
gRPC mengharuskan pengelolaan file skema .proto di seluruh layanan, yang menjadi tantangan koordinasi seiring pertumbuhan tim — perubahan proto adalah perubahan yang merusak jika tidak ditangani hati-hati, sehingga membutuhkan repositori proto bersama, strategi versioning, dan validasi CI. Proses debug juga lebih sulit karena pesan protobuf biner tidak dapat dibaca manusia dalam jejak jaringan, sehingga Anda memerlukan alat khusus seperti grpcurl atau Evans.
Belum tentu. Poin utama dalam post ini adalah bahwa pilihan protokol jarang menentukan kinerja sistem dalam praktik — desain payload, connection pooling, dan kemampuan operasional tim jauh lebih berpengaruh. Keputusan arsitektur seharusnya didorong oleh bottleneck yang terukur di sistem nyata Anda, bukan oleh benchmark dari perangkat keras orang lain.
Benchmark independen menunjukkan gRPC memberikan latensi hingga 77% lebih rendah dan throughput 107% lebih tinggi dibandingkan REST untuk payload kecil, dengan pengurangan 10x dalam ukuran pesan terserialisasi berkat Protocol Buffers. Itu adalah angka yang layak diperhatikan. Tapi saya telah membangun API internal dengan keduanya, dan jawaban jujurnya adalah: pilihan protokol jarang menentukan kinerja sistem dalam praktik. Yang lebih penting adalah desain payload, connection pooling, dan apakah tim Anda sebenarnya dapat mengoperasikan apa yang Anda bangun.
| Dimensi | REST | gRPC |
|---|---|---|
| Format payload | JSON, mudah dibaca manusia, ukuran payload lebih besar | Protocol Buffers, biner, bisa sampai 10x lebih kecil |
| Latensi | Latensi lebih tinggi, ada overhead parsing teks | Latensi hingga 77% lebih rendah untuk payload kecil |
| Throughput | Throughput dasar lewat HTTP/1.1 atau HTTP/2 | Throughput hingga 107% lebih tinggi berkat multiplexing HTTP/2 |
| Definisi kontrak | OpenAPI/Swagger, sering ditulis belakangan | File .proto sebagai satu-satunya sumber kebenaran, code-generated |
| Streaming | Butuh WebSocket atau SSE yang ditempel belakangan | Streaming dua arah native yang sudah jadi bagian protokol |
| Kemudahan debug | curl dan devtools browser langsung bisa dipakai | Butuh grpcurl atau proxy untuk memeriksa traffic |
| Paling cocok untuk | API publik dan komunikasi antar-service yang sederhana | Komunikasi microservice internal dengan throughput tinggi |
gRPC menggunakan HTTP/2 sebagai lapisan transport dan Protocol Buffers (protobuf) sebagai format serialisasi. HTTP/2 memungkinkan aliran yang dimultipleks melalui satu koneksi — beberapa permintaan dan respons dalam penerbangan secara bersamaan tanpa pemblokiran head-of-line. Protobuf menserialisasi data ke dalam format biner kompak, biasanya 3-10x lebih kecil dari JSON yang setara. gRPC juga menghasilkan stub klien dan server yang diketik dengan kuat dari file skema .proto.
gRPC mendukung empat pola: Unary (satu permintaan, satu respons — setara dengan REST), Server Streaming (satu permintaan, aliran respons), Client Streaming (aliran permintaan, satu respons), dan Bidirectional Streaming (full duplex). REST dapat mendekati pola-pola ini dengan SSE atau WebSocket, tetapi gRPC menjadikannya pola kelas pertama dengan kode yang dihasilkan.
Traffic Pattern Decision Guide
NORTH-SOUTH (External Traffic)
─────────────────────────────────────────────────
Browser / Mobile App / Partner API
│
▼ HTTP/1.1 + JSON (REST)
┌─────────────────┐
│ API Gateway │ ← Use REST here
│ (Public API) │
└────────┬────────┘
│
│ EAST-WEST (Internal Traffic)
─────────┼───────────────────────────────────────
│ HTTP/2 + Protobuf (gRPC)
┌──────┴──────┬──────────────┐
▼ ▼ ▼
Order Inventory Payment
Service Service Service
(NestJS) (NestJS) (NestJS)
│ │ │
└─────────────┴──────────────┘
gRPC — 77% lower latency
10x smaller payloadsDari proyek NestJS saya: gunakan gRPC untuk lalu lintas east-west (layanan-ke-layanan di dalam cluster Anda) dan REST untuk lalu lintas north-south (klien eksternal, browser, aplikasi mobile, API mitra). Browser tidak dapat memanggil gRPC secara asli tanpa grpc-web atau proxy transkoding. Jika API Anda dikonsumsi oleh pihak ketiga, REST menang dalam aksesibilitas setiap saat.
NestJS memiliki dukungan gRPC asli melalui @nestjs/microservices. Anda mendefinisikan file .proto, mengonfigurasi transport gRPC di microservice Anda, dan menggunakan dekorator @GrpcMethod atau @GrpcStreamMethod pada handler Anda. Di sisi klien, Anda menyuntikkan instansi ClientGrpc dan memanggil metode langsung sebagai fungsi TypeScript.
// inventory.proto
syntax = "proto3";
package inventory;
service InventoryService {
rpc CheckStock (CheckStockRequest) returns (CheckStockResponse);
rpc StreamInventory (Empty) returns (stream InventoryUpdate);
}
message CheckStockRequest { string product_id = 1; }
message CheckStockResponse { int32 quantity = 1; bool available = 2; }
// inventory.controller.ts (NestJS gRPC handler)
@Controller()
export class InventoryController {
@GrpcMethod('InventoryService', 'CheckStock')
async checkStock(data: CheckStockRequest): Promise<CheckStockResponse> {
const stock = await this.inventoryRepo.getStock(data.productId);
return { quantity: stock.quantity, available: stock.quantity > 0 };
}
}
// order.service.ts (gRPC client)
@Injectable()
export class OrderService {
private inventoryService: InventoryServiceClient;
onModuleInit() {
this.inventoryService = this.client.getService<InventoryServiceClient>('InventoryService');
}
async createOrder(dto: CreateOrderDto) {
const stock = await firstValueFrom(
this.inventoryService.checkStock({ productId: dto.productId })
);
if (!stock.available) throw new ConflictException('Out of stock');
// proceed with order creation...
}
}Studi benchmark 2025 yang membandingkan gRPC dan REST di bawah beban yang setara menemukan: gRPC memberikan latensi rata-rata 48% lebih rendah untuk payload kecil (di bawah 1KB), penggunaan CPU 19% lebih rendah, konsumsi memori 34% lebih rendah, dan bandwidth jaringan 41% lebih rendah. Untuk API internal frekuensi tinggi — misalnya, layanan pesanan yang mengkueri layanan inventaris ribuan kali per menit — keuntungan ini menghasilkan penghematan biaya infrastruktur yang berarti.
gRPC memerlukan pengelolaan file .proto di seluruh layanan, yang menjadi tantangan koordinasi seiring pertumbuhan tim. Perubahan skema Proto adalah perubahan yang merusak jika tidak ditangani dengan hati-hati — Anda memerlukan repositori proto, strategi versioning, dan validasi CI. Men-debug gRPC lebih sulit daripada REST karena pesan protobuf biner tidak dapat dibaca manusia dalam jejak jaringan.
REST tetap menjadi pilihan yang tepat ketika: API Anda dikonsumsi oleh browser atau klien eksternal; tim Anda terutama berpengalaman REST dan biaya adopsi melebihi keuntungan kinerja; Anda membutuhkan pengujian berbasis curl sederhana dan alat HTTP standar; tingkat permintaan Anda cukup rendah sehingga efisiensi protokol tidak penting.
Untuk API internal di mana fleksibilitas kueri lebih penting daripada throughput — seperti BFF (Backend for Frontend) yang mengagregasi beberapa microservice — GraphQL layak dipertimbangkan. GraphQL membiarkan klien meminta persis bidang yang mereka butuhkan, mengurangi over-fetching. Tetapi GraphQL memiliki overhead operasionalnya sendiri: schema stitching, masalah kueri N+1, kompleksitas caching.
Panggilan layanan internal frekuensi tinggi (>1000/menit): gunakan gRPC untuk penghematan latensi dan bandwidth. Panggilan layanan internal frekuensi rendah: gunakan REST untuk kesederhanaan. API yang menghadap publik: selalu REST. Streaming data: gRPC streaming. Tim tanpa pengalaman gRPC dalam tenggat waktu: REST dulu, migrasi jika Anda mengalami masalah kinerja nyata.