🔌 gRPC Intermediate

How do you implement streaming in gRPC?

Answer

Server streaming example in Go: define rpc ListItems(ListRequest) returns (stream Item), implement as func (s *server) ListItems(req *ListRequest, stream pb.ItemService_ListItemsServer) error { for _, item := range items { if err := stream.Send(item); err != nil { return err } }; return nil }. The server loops and calls stream.Send() for each message. Client reads: for { item, err := stream.Recv(); if err == io.EOF { break }; use(item) }. Bidirectional streaming: both sides call Send() and Recv() concurrently, typically in separate goroutines. Key considerations: error handling on every send/receive, context cancellation to detect client disconnection, backpressure via HTTP/2 flow control (slowing sends when the receiver is slow), and deadline propagation (streams respect the parent context deadline).