Looking at https://godoc.org/google.golang.org/grpc#ClientConn.NewStream, it implies that I need to take steps to avoid a go-routine leak. However, I was wondering if cancelling a context (option 2), would also force the buffered messages to be flushed.
No, canceling the context kills the stream ASAP, resulting in the loss of buffered messages. The only way to ensure delivery of messages is to finish the RPC completely (call RecvMsg until it returns a non-nil error) or build it into your protocol (i.e. the server sends ack responses to individual request messages).