Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Google App Engine "manual_scaling" not working

Currently my Google App Engine design have a front end talking to a resident backend via a URL fetch. The new design will use a module instead of a backend. This is the direction Google wants people to go so this shouldn't be difficult but getting this to run in production has stumped me for days. The "manual_scaling" just doesn't work for me. The "manual_scaling" work fine in the dev_appserver.py (1.8.3) just doesn't work in production. I have simplied the problem as much as possible. Here's a four files that should duplicate the issue:

Source Code

app.yaml

api_version: 1
application: myapp
version: 123456
runtime: python27
threadsafe: true
handlers:
- url: /send_hello/.*
  script: send_hello.app
- url: /hello/.*
  script: hello.app

hello.yaml

api_version: 1
application: myapp
module: hello
version: 123456
runtime: python27
threadsafe: true
#comment out these next two lines and it works!!!
manual_scaling:
  instances: 1
handlers:
- url: /_ah/start
  script: hello.app
- url: /hello/.*
  script: hello.app

hello.py

import webapp2
import logging
from google.appengine.api import modules

class HelloHandler(webapp2.RequestHandler):
  def get(self):
      who = modules.get_current_module_name() 
      logging.info("Hello from the '%s' module" %  who)
      self.response.headers['Content-Type'] = 'text/plain'
      self.response.out.write("Hello from the '%s' module!\n" % who)

mappings = [
   (r'/_ah/start', HelloHandler),
   (r'/hello/.*', HelloHandler)
   ]

app = webapp2.WSGIApplication(mappings, debug=True)

send_hello.py

import logging
import webapp2
from google.appengine.api import urlfetch
from google.appengine.api import modules

class SendHelloHandler(webapp2.RequestHandler):
   def get(self):
       url = "http://%s/hello/world" % modules.get_hostname(module="hello")

       logging.info('backend url: %s' % url)
       response = urlfetch.fetch(url=url, method=urlfetch.GET)

       reply = 'backend response: %d %s' % (response.status_code, response.content))
       logging.info(reply)

       self.response.headers['Content-Type'] = 'text/plain'
       self.response.out.write(reply)


mappings = [
    (r'/send_hello/.*', SendHelloHandler)
    ]

app = webapp2.WSGIApplication(mappings, debug=True)

Testing with the development server works great

Launch it it runs great and you can see the manual scaling instances start up

$ dev_appserver.py app.yaml hello.yaml
WARNING  2013-08-17 00:19:37,131 api_server.py:317] Could not initialize images API; you are likely missing the Python "PIL" module.
INFO     2013-08-17 00:19:37,134 api_server.py:138] Starting API server at: http://localhost:34319
INFO     2013-08-17 00:19:37,147 dispatcher.py:164] Starting module "default" running at: http://localhost:8080
INFO     2013-08-17 00:19:37,157 dispatcher.py:164] Starting module "hello" running at: http://localhost:8081
INFO     2013-08-17 00:19:37,160 admin_server.py:117] Starting admin server at: http://localhost:8000
INFO     2013-08-17 00:19:39,575 hello.py:9] Hello from the 'hello' module
INFO     2013-08-17 00:19:39,581 module.py:593] hello: "GET /_ah/start HTTP/1.1" 200 31

Call the front-end that calls the module, it works as expected:

$ curl "http://localhost:8080/send_hello/world"
backend response: 200 Hello from the 'hello' module!

Call the module directly, it works as expected

$ curl "http://localhost:8081/hello/world"
Hello from the 'hello' module!

Testing with the production server fails

Load the app into production

$ appcfg.py update app.yaml hello.yaml

Call the front-end that calls the module.. and get a 404

$ curl "http://123456.myapp.appspot.com/send_hello/world"
backend response: 404
<html><head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>404 Not Found</title>
</head>
<body text=#000000 bgcolor=#ffffff>
<h1>Error: Not Found</h1>
<h2>The requested URL <code>/hello/world</code> was not found on this server.</h2>
<h2></h2>
</body></html>

Call the module directly and get of 503 error

$ curl "http://hello.myapp.appspot.com/hello/world"

<html><head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>503 Server Error</title>
</head>
<body text=#000000 bgcolor=#ffffff>
<h1>Error: Server Error</h1>
<h2>The service you requested is not available yet.<p>Please try again in 30 seconds. </h2>
<h2></h2>
</body></html>

Call the module with the version specifier and get a 404 error:

$ curl "http://123456.hello.myapp.appspot.com/hello/world"

<html><head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>404 Not Found</title>
</head>
<body text=#000000 bgcolor=#ffffff>
<h1>Error: Not Found</h1>
<h2>The requested URL <code>/hello/world</code> was not found on this server.</h2>
<h2></h2>
</body></html>

The Question...

is why doesn't the production manual_scaling instances start up on the production server aka the actual Google server? Notice that if you comment out the manual scaling lines in "app.yaml" the app works as expected in production environment.

Another clue is the Google App Engine console shows no logging for "hello" modules and doesn't show any active instances. And strangely the appcfg.py start hello.yaml says it already running.

Another way to answer this question is point me toward a complete working example of "manual scaling" with modules (the snippets from Google are not enough).

like image 873
swdev Avatar asked Mar 28 '26 01:03

swdev


1 Answers

Figured out my own issue...

Change the version: 123456 in the .yaml files to be version: v123456 and it works as expected in production.

Using an integer for a version appears not to be supported in the case of 'manual_scaling' module type. Perhaps it makes the URL for a specific instances ambiguous.

like image 80
swdev Avatar answered Mar 29 '26 13:03

swdev



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!