Notice: Over the next few months, we're reorganizing the App Engine documentation site to make it easier to find content and better align with the rest of Google Cloud products. The same content will be available, but the navigation will now match the rest of the Cloud products.

Creating Persistent Connections with WebSockets

Region ID

The REGION_ID is an abbreviated code that Google assigns based on the region you select when you create your app. The code does not correspond to a country or province, even though some region IDs may appear similar to commonly used country and province codes. For apps created after February 2020, REGION_ID.r is included in App Engine URLs. For existing apps created before this date, the region ID is optional in the URL.

Learn more about region IDs.

You can use WebSockets to create a persistent connection from a client (such as a mobile device or a computer) to an App Engine instance. The open connection allows two-way data exchange between the client and the server at any time, resulting in lower latency and better use of resources.


The WebSockets protocol, defined in RFC 6455, provides a full-duplex communication channel between a client and a server. The channel is initiated from an HTTP(S) request with an "upgrade" header.

Typical use cases for WebSockets include:

  • Real time event updates, such as social media feeds, sports scores, news, or stock market prices
  • User notifications, such as software or content updates
  • Chatting applications
  • Collaborative editing tools
  • Multiplayer games

WebSockets are always available to your application without any additional setup. Once a WebSockets connection is established, it will time out after one hour.

Running a sample application with WebSockets

First, follow the instructions in "Hello, World!" for Java on App Engine to set up your environment and project, and to understand how App Engine Java apps are structured.

Clone the sample app

Copy the sample apps to your local machine, and navigate to the websockets directory:

git clone
cd java-docs-samples/flexible/websocket-jetty/

Run the sample locally

To run the sample application on your local computer:

  1. Start the local Eclipse Jetty web server using the Jetty Maven plugin:

    mvn jetty:run-exploded
  2. In your web browser, enter the following address:


Deploy and run the sample on App Engine

To deploy your application to the App Engine flexible environment, run the following command from the websocket-jetty directory:

mvn package appengine:deploy -Dapp.deploy.projectId=PROJECT_ID

Replace PROJECT_ID with the ID of your Cloud project. If your pom.xml file already specifies your project ID, you don't need to include the -Dapp.deploy.projectId property in the command you run.

The sample application is packaged as a jar, and runs automatically using the Java 8/Jetty 9 with Servlet 3.1 Runtime.

You can then direct your browser to

To test the JavaScript client, access

Session affinity

Not all clients support WebSockets. To work around this, many applications use libraries such as that fall back on http long polling with clients that don't support WebSockets.

App Engine typically distributes requests evenly among available instances. However, when using http long polling, multiple sequential requests from a given user need to reach the same instance.

To allow App Engine to send requests by the same user to the same instance, you can enable session affinity. App Engine then identifies which requests are sent by the same users by inspecting a cookie and routes those requests to the same instance.

Session affinity in App Engine is implemented on a best-effort basis. When developing your app, you should always assume that session affinity is not guaranteed. A client can lose affinity with the target instance in the following scenarios:

  • The App Engine autoscaler can add or remove instances that serve your application. The application might reallocate the load, and the target instance might move. To minimize this risk, ensure that you have set the minimum number of instances to handle the expected load.
  • If the target instance fails health checks, App Engine moves the session to a healthy instance. For more information about health checks and their customization options, see Split health checks.
  • Session affinity is lost when an instance is rebooted for maintenance or software updates. App Engine flexible environment VM instances are restarted on a weekly basis.

Because session affinity isn't guaranteed, you should only use it to take advantage of the ability of and other libraries to fall back on HTTP long polling in cases where the connection is broken. You should never use session affinity to build stateful applications.

Enabling and disabling session affinity

By default, session affinity is disabled for all App Engine applications. Session affinity is set at the version level of your application and can be enabled or disabled on deployment.

To enable session affinity for your App Engine version, add the following entry to your app.yaml file:

  session_affinity: true

Once the version is deployed with the updated app.yaml, new requests will start serving from the same instance as long as that instance is available.

To turn off session affinity, remove the entry from your app.yaml file, or set the value to false:

  session_affinity: false