My application wishes to have:
Automatic scalability
Client/server affinity
How can I accomplish this?
You can achieve these goals using App Engine backends (long-running, configurable, addressable, persistent servers):
Configure a backend to be both public and dynamic
# backends.yaml
backends:
- name: foo
instances: 20
options: public, dynamic
In addition to deploying your app in usual way:
appcfg.py update .
remember to deploy you backend:
appcfg.py backends . update
For the initial connection, have your client use the non-instance specific backend hostname, e.g.:
foo.your_app_id.appspot.com
App Engine will route your request to available backend instance, after optionally starting a new backend instance.
In the request handling code on the server, use the backends API to determine which instance is handling the request and return to the client a instance specific URL.
from google.appengine.api import backends
import webapp2
class GetPersistentUrlHandler(webapp2.RequestHandler):
def get(self):
"""Return the current backend's instance-specific URL."""
my_url = backends.get_url(instance=backends.get_instance())
self.response.write(my_url)
app = webapp2.WSGIApplication([
('/get_peristent_url', GetPersistentUrlHandler),
], debug=True)
Client makes subsequent connections to the instance specific backend URL:
http://3.foo.your_app_id.appspot.com
Note: when using https be sure to replace subdomain dots with -dot-
in order to avoid SSL certificate issues.
https://3-dot-foo.your_app_id.appspot.com
To complement Adam's good answer: you don't need server affinity in GAE, because data stored in the HTTP session is not held in memory, but in the persistent datastore. So any server will find what any other server previously stored in the session. See the documentation:
App Engine includes an implementation of sessions, using the servlet session interface. The implementation stores session data in the App Engine datastore for persistence, and also uses memcache for speed. As with most other servlet containers, the session attributes that are set with
session.setAttribute()
during the request are persisted at the end of the request.This feature is off by default. To turn it on, add the following to appengine-web.xml:
<sessions-enabled>true</sessions-enabled>
The implementation creates datastore entities of the kind
_ah_SESSION
, and memcache entries using keys with a prefix of_ahs
.Note: Because App Engine stores session data in the datastore and memcache, all values stored in the session must implement the
java.io.Serializable
interface.It's possible to reduce request latency by configuring your application to asynchronously write HTTP session data to the datastore:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With