Jump to Content
Serverless

Introducing WebSockets, HTTP/2 and gRPC bidirectional streams for Cloud Run

January 21, 2021
Ahmet Alp Balkan

Senior Developer Advocate

We are excited to announce a broad set of new traffic serving capabilities for Cloud Run: end-to-end HTTP/2 connections, WebSockets support, and gRPC bidirectional streaming, completing the types of RPCs that are offered by gRPC. With these capabilities, you can deploy new kinds of applications to Cloud Run that were not previously supported, while taking advantage of serverless infrastructure. These features are now available in public preview for all Cloud Run locations.

Support for streaming is an important part of building responsive, high-performance applications. The initial release of Cloud Run did not support streaming, as it buffered both the request from the client and the service’s response. In October, we announced server-side streaming support, which lets you stream data from your serverless container to your clients. This allowed us to lift the prior response limit of 32 MB and support server-side streaming for gRPC. However, this still did not allow you to run WebSockets and gRPC with either client-streaming or bidirectional streaming.

WebSockets and gRPC bidirectional streaming

With the new bidirectional streaming capabilities, Cloud Run can now run applications that use WebSockets (e.g., social feeds, collaborative editing, multiplayer games) as well as the full range of gRPC bi-directional streaming APIs. With these bidirectional streaming capabilities, both the server and the client keep exchanging data over the same request. WebSockets and bidirectional RPCs allow you to build more responsive applications and APIs. This means you can now build a chat app on top of Cloud Run using a protocol like WebSockets, or design streaming APIs using gRPC.

Here's an example of a collaborative live "whiteboard" application running as a container on Cloud Run, serving two separate WebSocket sessions on different browser windows. Note the real time updates to the canvases on both windows:

https://storage.googleapis.com/gweb-cloudblog-publish/original_images/WebSockets_and_gRPC_bidirectional_streaming.gif

Using WebSockets on Cloud Run doesn’t require any extra configuration and works out of the box. To use client-side streaming or bidirectional streaming with gRPC, you need to enable HTTP/2 support, which we talk about in the next section.

To try out a sample WebSockets application on Cloud Run, deploy this whiteboard example from Socket.io by clicking on this link.

It's worth noting that WebSockets streams are still subject to the request timeouts configured on your Cloud Run service. If you plan to use WebSockets, make sure to set your request timeout accordingly.

End-to-end HTTP/2 support

Even though many apps don’t support it, Cloud Run has supported HTTP/2 since its first release, including end-to-end HTTP/2 for gRPC. It does so by automatically upgrading clients to use the protocol, making your services faster and more efficient. However, until now, HTTP/2 requests were downgraded to HTTP/1 when they were sent to a container.

Starting today, you can use end-to-end HTTP/2 transport on Cloud Run. This is useful for applications that already support HTTP/2. For apps that don’t support HTTP/2, Cloud Run will simply continue to handle HTTP/2 traffic up until it arrives at your container.

For your service to serve traffic with end-to-end HTTP/2, your application needs to be able to handle requests with the HTTP/2 cleartext (also known as "h2c") format. We have developed a sample h2c server application in Go for you to try out the "h2c" protocol. You can build and deploy this app to Cloud Run by cloning the linked repository and running:

Loading...

In the example command above, the "--use-http2" option indicates that the application supports the "h2c" protocol and ensures the service gets the HTTP/2 requests without downgrading them.

Once you’ve deployed the service, use the following command to validate that the request is served using HTTP/2 and not being downgraded to HTTP/1:

curl -v --http2-prior-knowledge https://<SERVICE_URL>

You can also configure your service to use HTTP/2 in the Google Cloud Console:

https://storage.googleapis.com/gweb-cloudblog-publish/images/advance_settings.max-1000x1000.jpg

Getting started 

With these new networking capabilities, you can now deploy and run a broader variety of web services and APIs to Cloud Run. To learn more about these new capabilities, now in preview, check out the WebSockets demo app or the sample h2c server app.

If you encounter issues or have suggestions, please let us know. You can also help us shape the future of Cloud Run by participating in our research studies.

Posted in