Jelajahi binding ketiga A2A: gRPC. Dari definisi protobuf untuk service A2A, keunggulan streaming dan backpressure, kapan memilih gRPC versus HTTP/JSON, sampai interop lewat gateway dan reuse server handler.

Di episode 10 agent kalian sudah multi-tenant dan bisa berunding versi protokol. Namun bayangkan satu orchestrator yang memanggil puluhan remote agent dengan HTTP+JSON dan SSE: setiap request membawa overhead serialisasi teks, koneksi dibuka-tutup terus, dan streaming di atas HTTP/1.1 terasa seperti selang bocor. A2A punya jawaban ketiga untuk transport: gRPC.
Roadmap episode ini: kita mulai dari bagaimana gRPC menjadi binding resmi ketiga, bedah definisi protobuf untuk service A2A, keunggulan streaming dan backpressure, kriteria kapan gRPC lebih unggul dari HTTP/JSON, dan terakhir interop lewat gateway serta reuse server handler.
Sejak awal, A2A dirancang sebagai protokol multi-transport: JSON-RPC 2.0 over HTTP dengan SSE sebagai binding utama, dan gRPC ditambahkan sebagai binding resmi sejak v0.3 (Juli 2025). Alasan penambahannya sederhana — ekosistem membutuhkan transport berperforma tinggi untuk komunikasi antar service, dan gRPC adalah standar de facto-nya: skema tegas via protobuf, transport HTTP/2, dan streaming yang didukung native.
Di A2A v1.0, gRPC bukan eksperimen — ia menjadi warga kelas satu. Agent Card mendeklarasikannya di supported_interfaces dengan protocol_binding bernilai gRPC, client bisa memilihnya seperti memilih JSON-RPC, dan SDK resmi Python, TypeScript, Go, Java, serta .NET menyediakan implementasinya.
Skema gRPC didefinisikan dalam file protobuf resmi A2A — satu sumber kebenaran untuk semua bahasa. Isinya memetakan method JSON-RPC yang kita kenal dari episode 5 ke dalam RPC: MessageSend untuk message/send, SendSubscribe untuk streaming, GetTask untuk tasks/get, dan Cancel untuk tasks/cancel:
syntax = "proto3";
package a2a.v1;
service A2AService {
rpc MessageSend(MessageSendRequest) returns (MessageSendResponse);
rpc SendSubscribe(SendSubscribeRequest) returns (stream SendSubscribeResponse);
rpc GetTask(GetTaskRequest) returns (GetTaskResponse);
rpc Cancel(CancelRequest) returns (CancelResponse);
}
message MessageSendRequest {
string task_id = 1;
Message message = 2;
}
message MessageSendResponse {
Task task = 1;
}Perhatikan SendSubscribe yang mengembalikan stream — inilah bentuk gRPC dari SSE streaming yang kita bahas di episode 7. Dari skema ini, tooling protobuf menghasilkan stub client dan server dalam berbagai bahasa, sehingga pemanggilan MessageSend di Go atau Python berbicara pada service yang sama dengan definisi identik.
Mengapa gRPC unggul untuk streaming? Jawabannya ada di HTTP/2 dan desain protobuf:
Backpressure inilah yang membuat gRPC terasa "jujur": saat receiver lambat, aliran melambat dengan sendirinya, bukan membanjiri antrean tak terbatas seperti yang kerap terjadi pada SSE di HTTP/1.1.
gRPC bukan pengganti HTTP/JSON dalam semua kasus — keduanya saling melengkapi. Kriteria pilihannya:
| Pertimbangan | gRPC | HTTP/JSON |
|---|---|---|
| Skema | Tegas, protobuf | Fleksibel, JSON |
| Streaming | HTTP/2, dua arah, backpressure | SSE satu arah |
| Performa | Tinggi, payload biner | Sedang, payload teks |
| Aksesibilitas | Perlu tooling/stub | Browser, curl, tool apa pun |
| Debugging | Perlu grpcurl / reflection | Bisa dengan curl langsung |
Aturan praktisnya: pakai gRPC untuk komunikasi internal antar agent yang kita kontrol penuh — throughput tinggi, streaming berat, lalu lintas besar. Pakai HTTP/JSON untuk permukaan eksternal — mitra, browser, debugging cepat, dan siapa pun yang tidak mau menggenggam stub protobuf. Banyak production memakai keduanya sekaligus: gRPC di dalam jaringan agent, HTTP/JSON di gerbang publik.
Info
Kedua binding ini menerjemahkan konsep yang sama — task lifecycle, message, part — sehingga memilih transport tidak berarti menulis ulang logika agent. Eksekusi, task store, dan Agent Card tetap satu, hanya lapisan transpor yang berbeda.
Karena kedua binding hidup berdampingan, kebutuhan interop muncul: client HTTP memanggil agent yang hanya mengekspos gRPC, atau sebaliknya. Ada dua strategi umum.
Strategi pertama: gateway transparan. Tooling seperti gRPC-gateway atau Envoy menerjemahkan request HTTP+JSON menjadi panggilan gRPC dan mengembalikan respons sebagai JSON. Client luar tetap memakai curl atau SDK HTTP biasa; gateway yang menangani terjemahan. Ini pola favorit untuk mengekspos service gRPC internal ke mitra eksternal.
Strategi kedua: reuse server handler. SDK resmi mendorong desain ini: executor dan task store ditulis sekali, lalu dipasang pada handler JSON-RPC maupun handler gRPC. Di SDK Python, handler gRPC dirakit dari komponen yang sama dengan versi HTTP:
from a2a.server.request_handlers import GrpcHandler
grpc_handler = GrpcHandler(
agent_executor=my_executor,
task_store=task_store,
agent_card=card,
)Karena GrpcHandler menerima agent_executor dan task_store yang identik dengan versi HTTP, logika agent tidak pernah ganda. Satu perubahan pada perilaku task langsung berlaku untuk kedua transport. Untuk verifikasi cepat, tool grpcurl menjadi pendamping curl — panggilan grpcurl -plaintext localhost:50051 a2a.v1.A2AService/MessageSend mengetes service tanpa menulis kode apa pun:
grpcurl -plaintext -d '{"message":{"role":"user","parts":[{"kind":"text","text":"Analisis lead"}]}}' \
localhost:50051 a2a.v1.A2AService/MessageSendDengan -plaintext untuk koneksi tanpa TLS lokal, grpcurl mengirim request dan menampilkan respons — cara tercepat memastikan service gRPC kalian hidup.
Episode 11 menutup pembahasan binding transport A2A. gRPC hadir sebagai binding ketiga sejak v0.3 dan matang di v1.0, dengan definisi protobuf sebagai sumber kebenaran skema, streaming HTTP/2 dengan backpressure, dan payload biner yang lebih ringkas. Pilihan antara gRPC dan HTTP/JSON bergantung pada konteks — internal berperforma tinggi untuk gRPC, permukaan publik untuk HTTP/JSON. Dan berkat reuse handler serta gateway, keduanya bisa hidup berdampingan tanpa menduplikasi logika agent.
Inti yang harus dibawa pulang:
supported_interfaces pada Agent Card.SendSubscribe.Setelah transport, autentikasi, multi-tenancy, dan konten dikuasai, pertanyaan berikutnya adalah produktivitas: haruskah kalian menulis semua ini dari nol? Di episode 12 kita membahas ADK & Framework Integration — mengekspos agent Google ADK sebagai A2A server, memakai remote A2A agent sebagai sub-agent, hingga adapter pattern untuk LangChain, LangGraph, CrewAI, dan OpenAI Agents SDK. Sampai jumpa!