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

76. Menyambungkan gRPC Service dengan Kafka

IH
Ihsan Arif
Penulis di Santekno · Backend Engineer

76. Menyambungkan gRPC Service dengan Kafka

Dalam membangun sistem terdistribusi modern, pola komunikasi antar-microservices menjadi sangat krusial. Dua teknologi populer yang sering digunakan adalah gRPC dan Apache Kafka. Kombinasi dua teknologi ini menawarkan kecepatan, kestabilan, serta skalabilitas untuk sistem enterprise. Pada artikel kali ini, saya akan membahas tentang bagaimana menyambungkan gRPC Service dengan Kafka—mulai dari arsitektur, implementasi kode, hingga simulasi pengujian.


Mengapa Perlu Integrasi gRPC dengan Kafka?

gRPC adalah sistem komunikasi Remote Procedure Call (RPC) modern berbasis HTTP/2 dan Protocol Buffers, yang efisien untuk komunikasi synchronous antar service. Sementara Kafka adalah message broker yang powerful untuk pengiriman pesan asynchronous dalam jumlah masif.

Pola tipikal yang sering digunakan:

  • gRPC sebagai API service layer (front-facing service, melakukan validasi, dan proses sinkronus).
  • Kafka sebagai event bus untuk komunikasi asinkron dan pengolahan data secara real-time/batch oleh downstream service.

Dengan begitu, setiap request yang diterima oleh gRPC bisa dipush sebagai event ke Kafka—membuka jalan bagi service lain untuk bereaksi terhadap event tersebut secara loose-coupled.


Studi Kasus: Order Service

Bayangkan kita membangun Order Service (gRPC) yang, setiap kali user membuat order baru, service ini akan mem-publish order event ke Kafka. System lain seperti Inventory Service, Notification Service akan mengonsumsi event ini untuk memproses lebih lanjut.


Arsitektur High Level

Mari kita lihat alur sistem ini dengan kode Mermaid Diagram:

MERMAID
sequenceDiagram
    participant Client
    participant gRPC Service
    participant Kafka
    participant Consumer Service

    Client->>gRPC Service: gRPC call (CreateOrder)
    gRPC Service->>Kafka: Publish OrderCreated event
    Kafka->>Consumer Service: Consumer receives OrderCreated event

Langkah singkat:

  1. Client mengirim permintaan CreateOrder ke gRPC Service.
  2. gRPC Service memvalidasi, lalu push event OrderCreated ke Kafka topic.
  3. Service lain menjadi consumer dari topic tersebut.

Persiapan Lingkungan

Untuk simulasi, kita akan menggunakan stack berikut:

  • Go sebagai bahasa pemrograman (karena binding gRPC dan Kafka di Go sangat solid)
  • protoc untuk generate stubs dari proto file
  • sarama sebagai Kafka client di Go

Kode berikut relevan untuk stack selain Go, karena prinsipnya sama (publish event ke Kafka setelah menangani gRPC).


1. Definisi Protobuf

File: order.proto

proto
 1syntax = "proto3";
 2
 3package order;
 4
 5service OrderService {
 6  rpc CreateOrder (OrderRequest) returns (OrderResponse);
 7}
 8
 9message OrderRequest {
10  string item = 1;
11  int32 qty = 2;
12  string user_id = 3;
13}
14
15message OrderResponse {
16  string order_id = 1;
17  string status = 2;
18}

Generate kode Go untuk service dan message tersebut.


2. Implementasi gRPC Server dengan Kafka Publisher

File: main.go

go
 1package main
 2
 3import (
 4	"context"
 5	"log"
 6	"net"
 7
 8	pb "github.com/yourorg/orderpb"
 9	"github.com/Shopify/sarama"
10	"google.golang.org/grpc"
11)
12
13type server struct {
14	producer sarama.SyncProducer
15	pb.UnimplementedOrderServiceServer
16}
17
18func (s *server) CreateOrder(ctx context.Context, req *pb.OrderRequest) (*pb.OrderResponse, error) {
19	orderID := generateOrderID() // fungsi random, misal UUID
20
21	event := map[string]interface{}{
22		"order_id": orderID,
23		"item":     req.Item,
24		"qty":      req.Qty,
25		"user_id":  req.UserId,
26	}
27
28	// Serialize ke JSON
29	marshalled, err := json.Marshal(event)
30	if err != nil {
31		return nil, err
32	}
33
34	// Publish ke Kafka topic
35	message := &sarama.ProducerMessage{
36		Topic: "order_events",
37		Value: sarama.ByteEncoder(marshalled),
38	}
39
40	_, _, err = s.producer.SendMessage(message)
41	if err != nil {
42		return nil, err
43	}
44
45	return &pb.OrderResponse{
46		OrderId: orderID,
47		Status:  "CREATED",
48	}, nil
49}
50
51func main() {
52	// Inisialisasi Kafka producer
53	config := sarama.NewConfig()
54	config.Producer.Return.Successes = true
55	producer, err := sarama.NewSyncProducer([]string{"localhost:9092"}, config)
56	if err != nil {
57		log.Fatalf("Failed to start Sarama producer: %v", err)
58	}
59
60	lis, err := net.Listen("tcp", ":50051")
61	if err != nil {
62		log.Fatalf("Failed to listen: %v", err)
63	}
64	grpcServer := grpc.NewServer()
65	pb.RegisterOrderServiceServer(grpcServer, &server{producer: producer})
66
67	log.Println("gRPC & Kafka server running at :50051 ...")
68	if err := grpcServer.Serve(lis); err != nil {
69		log.Fatalf("Failed to serve: %v", err)
70	}
71}

Penjelasan Kode

  • Setiap berhasil create order, event didorong ke Kafka Topic.
  • gRPC tetap memberikan response synchronous ke client (“CREATED”).
  • Kode mudah dikembangkan untuk juga melakukan sinkronisasi database, logging, dsb.

3. Kafka Consumer (simulasi)

Order Event dari Kafka ini bisa dikonsumsi oleh service lain seperti berikut:

go
 1consumer, err := sarama.NewConsumer([]string{"localhost:9092"}, nil)
 2if err != nil {
 3    panic(err)
 4}
 5partitionConsumer, err := consumer.ConsumePartition("order_events", 0, sarama.OffsetNewest)
 6if err != nil {
 7    panic(err)
 8}
 9for message := range partitionConsumer.Messages() {
10    var event map[string]interface{}
11    if err := json.Unmarshal(message.Value, &event); err == nil {
12        log.Printf("Order Event received: %+v\n", event)
13        // Lakukan hal lain: update stok, kirim email, dsb.
14    }
15}

Simulasi Pengujian

Mari kita buat simulasi pengujian menggunakan tabel step serta sample output log.

StepActionExpected Output
1Client gRPC call CreateOrderResponse {“order_id”: “…”, “status”:“CREATED”}
2Kafka topic receive eventEvent order muncul di Kafka
3Consumer membaca eventLog: Order Event received: …

Contoh log output:

text
12024/06/12 11:00:01 gRPC & Kafka server running at :50051 ...
22024/06/12 11:00:08 Order Event received: map[item:"Coffee" order_id:"123" qty:2 user_id:"abcde"]

Manfaat Arsitektur ini

Kelebihan

  • Scalability: Order event bisa diterima oleh banyak konsumen tanpa menambah beban pada gRPC API.
  • Decoupling: Downstream service bisa subscribe/unsubscribe tanpa mengubah code OrderService.
  • Reliability & Retries: Kafka mendukung re-delivery ketika konsumen gagal.
  • Asynchronous processing: Proses berat (misal update stok, kirim email) tak memblokir request client.

Kekurangan

  • Kebutuhan Infrastruktur: Perlu deploy dan mengelola Kafka cluster.
  • Error Handling: Perlu monitoring/kebijakan retry jika publish ke Kafka gagal.
  • Duplicate Event: Downstream service perlu idempoten (event bisa diterima lebih dari sekali).

Kesimpulan

Dengan mengombinasikan gRPC (untuk API synchronous) dan Kafka (untuk event asynchronous), kita bisa membangun microservices yang scalable dan loosely coupled. Teknik yang telah dijelaskan di atas sudah menjadi praktik terbaik di banyak perusahaan tech besar.

Berikut 📝 checklist integrasi gRPC + Kafka production ready:

  • Gunakan schema registry untuk event contracts (menghindari broken consumer)
  • Logging & distributed tracing di setiap step
  • Monitoring publish dan delivery event
  • Implementasi retry/retry policy pada publisher dan consumer

Integrasi ini cocok untuk berbagai use case — dari order management, payment, hingga notifikasi email/SMS.
Silakan coba struktur ini di proyek microservices Anda, dan nikmati kemudahannya dalam scaling layanan 🚀.


Artikel Terkait

💬 Komentar