Defining gRPC Services
1. Creating Service Definitions
| Element | Convention |
|---|---|
| Service name | PascalCase + Service suffix |
| Method name | PascalCase verb-first: CreateUser, ListUsers |
| Request/Response | MethodName + Request / + Response |
2. Defining Unary RPCs
| Property | Detail |
|---|---|
| Pattern | 1 request → 1 response |
| Use | Default for CRUD-like ops |
3. Defining Server Streaming RPCs
| Use Case | Detail |
|---|---|
| Large result set | Avoid huge single response |
| Real-time feed | Push updates as they happen |
4. Defining Client Streaming RPCs
| Use Case | Detail |
|---|---|
| File upload | Chunked transfer |
| Telemetry ingest | Batch metrics |
5. Defining Bidirectional Streaming RPCs
| Use Case | Detail |
|---|---|
| Chat / collaboration | Full-duplex |
| Real-time pricing | Subscribe + send updates |
6. Using Request Messages
| Best Practice | Reason |
|---|---|
| Always use a dedicated request message | Future-proof — can add fields |
| Avoid scalar parameters | Not extensible |
| Include pagination fields | page_size, page_token |
7. Using Response Messages
| Best Practice | Reason |
|---|---|
| Dedicated response message | Extensibility |
Include next_page_token | Pagination cursor |
| Avoid leaking server internals | Stable contract |
8. Defining Multiple Services
Example: Multiple services in one file
service UserService { rpc GetUser(...) returns (...); }
service AdminService { rpc DeleteUser(...) returns (...); }
| Tip | Detail |
|---|---|
| Split by audience | Public vs internal services |
| One service per file | Easier ownership & versioning |
9. Using Custom Method Options
| Option | Use |
|---|---|
(google.api.http) | REST mapping |
idempotency_level | Enables safe retries |
| Custom auth tags | Drive interceptor behavior |
10. Defining Empty Request or Response
| Option | Trade-off |
|---|---|
google.protobuf.Empty | Shortest, but cannot evolve |
| Custom empty message | Recommended — extensible later |