Linter rulesProtobufrpc-no-server-streaming

rpc-no-server-streaming

Since 0.9.0

This rule checks whether any RPC uses server streaming.

Rule Details

Server-streaming RPCs, whose response is declared with stream, are not supported by every transport: most HTTP/JSON gateways, for example, cannot carry them, and long-lived streams are harder to load-balance and debug than unary RPCs.

The rpc-no-server-streaming rule reports RPC '<rpc>' should not use server streaming for every RPC with a streamed response, including bidirectional streaming RPCs.

The rule is only part of the all ruleset.

Configuration

This rule has no options.

Examples

Good.

syntax = "proto3";

package acme.pets.v1;

service PetService {
  rpc ListPets(ListPetsRequest) returns (ListPetsResponse);
}

message ListPetsRequest {
  int32 page_size = 1;
  string page_token = 2;
}

message ListPetsResponse {
  repeated string names = 1;
  string next_page_token = 2;
}

Bad. The linter reports RPC 'WatchPets' should not use server streaming.

syntax = "proto3";

package acme.pets.v1;

service PetService {
  rpc WatchPets(WatchPetsRequest) returns (stream WatchPetsResponse);
}

message WatchPetsRequest {
  string shelter = 1;
}

message WatchPetsResponse {
  string name = 1;
}

When Not to Use It

You may disable this rule if all clients use a transport that supports streaming, such as gRPC over HTTP/2, and some RPCs need to push updates. To allow a single RPC, add an // apigenie-lint-disable rpc-no-server-streaming comment to it.

Compatibility

This rule is compatible with proto3 files. proto2 and editions files are rejected by the reader and are not linted.

Related rules