Skip to content
Santekno.com | Level Up Your Engineering Skills
ID
📖 0%
10 Jun 2025 · 5 mnt baca ·Artikel 2 / 110
Go

2 Perbandingan gRPC dengan REST dan GraphQL

IH
Ihsan Arif
Penulis di Santekno · Backend Engineer

Di era modern pengembangan sistem terdistribusi dan microservices, kebutuhan untuk komunikasi antarlayanan semakin krusial. Tiga pendekatan yang cukup populer adalah REST, GraphQL, dan gRPC. Masing-masing punya filosofi, kelebihan, dan kekurangan tersendiri. Dalam artikel ini saya akan membedah ketiganya secara teknis dengan perbandingan performa, skenario penggunaannya, juga contoh kode sederhana agar kita bisa memilih yang paling cocok sesuai kebutuhan.


Sekilas Tentang REST, GraphQL, & gRPC

REST (Representational State Transfer) telah menjadi andalan API development selama bertahun-tahun. Konsep resource, HTTP verbs, dan statelessness membuat REST sangat mudah dipahami dan diimplementasikan.

GraphQL adalah query language alternatif dari Facebook yang membuka fleksibilitas tinggi bagi klien untuk memilih data yang memang mereka butuhkan.

gRPC adalah framework komunikasi Remote Procedure Call (RPC) buatan Google using Protocol Buffers sebagai format serialization. gRPC mendukung streaming dan performa yang jauh lebih efisien berkat binary protocol.


Tabel Perbandingan: REST vs GraphQL vs gRPC

FiturRESTGraphQLgRPC
ProtocolHTTP/1.1HTTP/1.1/2HTTP/2
Format DataJSON/XMLJSONProtocol Buffers (binary)
SchemaTidak wajib (OpenAPI opsional)Harus, via type systemWajib, via Protobuf (.proto)
PerformanceLumayan, text-basedSerupa RESTSangat cepat, binary, multiplex
Client-ServerClient-drivenClient-drivenContract-first, server-defined
Realtime/StreamingPolling/WebSocket opsionalRealtime subscriptionNative streaming (bidirectional)
Dev toolsBanyak, matureBanyak, masih mudaGenerator multi bahasa, aktif
InteropMudah, standar WebMudah, standar WebBanyak bahasa, protocol native
VersioningVia URL/headersIntrospective, non-breakingMelalui .proto evolution

Diagram Alur: Request-Response Model

Mari kita visualisasikan alur data sederhana antar client dan service untuk masing-masing teknologi:

MERMAID
flowchart LR
    subgraph REST
        A[Client] -->|HTTP GET/POST| B[REST API]
        B -->|JSON Response| A
    end

    subgraph GraphQL
        C[Client] -->|Query / Mutation| D[GraphQL Server]
        D -->|JSON Response| C
    end

    subgraph gRPC
        E[Client Stub] -->|Proto
Request Message | F[gRPC Server] F -->|Proto
Response Message | E end

Kapan Pakai REST, GraphQL, atau gRPC?

REST cocok:

  • Aplikasi web publik/API third-party
  • Dokumentasi dan tooling besar
  • Prototyping cepat

GraphQL cocok:

  • Client mobile/web dengan kebutuhan data dinamis/minimal payload
  • Agregasi berbagai sumber data (API gateway)
  • Relasi kompleks antar resource

gRPC cocok:

  • Komunikasi internal antar microservices
  • Kebutuhan performa tinggi (low latency, high throughput)
  • Sistem real-time & streaming data

Contoh Kode: REST vs GraphQL vs gRPC

1. REST (Express.js)

javascript
1const express = require('express');
2const app = express();
3
4app.get('/books/:id', (req, res) => {
5  // Simulasi get data
6  res.json({ id: req.params.id, title: "Clean Code", author: "Robert C. Martin" });
7});
8
9app.listen(3000, () => console.log('REST API on port 3000'));

2. GraphQL (Apollo Server)

javascript
 1const { ApolloServer, gql } = require('apollo-server');
 2
 3// Type definitions
 4const typeDefs = gql`
 5  type Book { id: ID!, title: String!, author: String! }
 6  type Query { book(id: ID!): Book }
 7`;
 8
 9// Resolvers
10const resolvers = {
11  Query: { 
12    book: (_, { id }) => ({ id, title: "Clean Code", author: "Robert C. Martin" })
13  }
14};
15
16// Server
17const server = new ApolloServer({ typeDefs, resolvers });
18server.listen().then(({ url }) => console.log(`GraphQL ready at ${url}`));

3. gRPC (Node.js)

a. Protobuf Definition (book.proto):

proto
1syntax = "proto3";
2
3service BookService {
4  rpc GetBook(GetBookRequest) returns (Book);
5}
6
7message GetBookRequest { string id = 1; }
8message Book { string id = 1; string title = 2; string author = 3; }

b. Server Implementation:

javascript
 1const grpc = require('@grpc/grpc-js');
 2const protoLoader = require('@grpc/proto-loader');
 3
 4const packageDefinition = protoLoader.loadSync('book.proto');
 5const bookProto = grpc.loadPackageDefinition(packageDefinition);
 6
 7function getBook(call, callback) {
 8  callback(null, { id: call.request.id, title: "Clean Code", author: "Robert C. Martin" });
 9}
10
11const server = new grpc.Server();
12server.addService(bookProto.BookService.service, { GetBook: getBook });
13server.bindAsync('127.0.0.1:50051', grpc.ServerCredentials.createInsecure(), () => server.start());

Benchmark Sederhana: REST vs gRPC

Berikut simulasi perbandingan kecepatan ciri utama dari REST dan gRPC (tanpa GraphQL karena fokus performa pada REST vs gRPC):

Request CountREST (ms)gRPC (ms)Selisih
500850105745
100015801821398
10,00013300140011900
Danger
Note: Angka di atas adalah simulasi, rata-rata hasil benchmarking komunitas menggunakan nodejs/grpc dan nodejs/express.

Complex Data Fetching: Overfetching dan Underfetching

  • REST: Response tetap sama walau client hanya butuh satu field.
  • GraphQL: Client bisa spesifik request field apa saja.
  • gRPC: Mirip REST (satu RPC satu response fixed), tapi lebih fleksibel karena bisa buat service lebih granular.

Contoh Query GraphQL yang hanya memerlukan title, tidak butuh author:

graphql
1query {
2  book(id: "1") { title }
3}

REST dan gRPC harus mengembalikan semua nilai yang didefinisikan pada endpoint/service, atau harus custom.


Pengembangan dan Tools

  • REST: OpenAPI/Swagger, Postman, Insomnia
  • GraphQL: GraphQL Playground, Altair, Apollo Studio
  • gRPC: Evans, grpcurl, Postman (terbatas)

Evolusi API & Versioning

  • REST: /api/v1/books, /api/v2/books
  • GraphQL: Umumnya non-breaking, introspective schema
  • gRPC: Mendukung evolution (field number proto tidak boleh ganti) dan optional fields

Kesimpulan

Secara teknis, REST menawarkan kesederhanaan yang disukai banyak developer, terutama dalam API publik. GraphQL mengatasi masalah overfetch dan underfetch dengan fleksibilitas query, sisi client. Di sisi lain, gRPC adalah pilihan modern untuk komunikasi mesin-ke-mesin (machine-to-machine) di lingkungan microservices yang membutuhkan performa dan efisiensi tinggi.

Rekomendasi:

  • Jika API publik atau integrasi dengan banyak client eksternal: REST atau GraphQL.
  • Jika API internal, performa, dan kecepatan prioritas: gRPC.

Semua jalan punya karakteristik. Pilihlah berdasarkan kebutuhan, tim, dan ekosistem Anda!


Referensi:

Artikel Terkait

💬 Komentar