Google App Engine“manual_scaling”无法正常工作

目前,我的Google App Enginedevise的前端通过url提取与常驻后端对话。 新的devise将使用一个模块,而不是后端 。 这是谷歌希望人们走的方向,所以这不应该是困难的,但让这个在生产中运行已经困扰了我好几天。 “ manual_scaling ”只是不适合我。 dev_appserver.py(1.8.3)中的“manual_scaling”工作正常,在生产中不起作用。 我尽可能简化了这个问题。 这里有四个文件应该重现这个问题:

源代码

的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效果很好

启动它运行良好,你可以看到手动缩放实例启动

 $ 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 

调用调用模块的前端,它按预期工作:

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

直接调用模块,它按预期工作

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

生产服务器testing失败

加载应用程序进入生产

 $ appcfg.py update app.yaml hello.yaml 

调用调用模块的前端,并获得一个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> 

直接调用模块,得到503错误

 $ 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> 

用版本说明符调用模块,并得到一个404错误:

 $ 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> 

问题…

为什么生产manual_scaling实例不能在生产服务器(也就是实际的Google服务器)上启动? 请注意,如果您在“app.yaml”中注释掉手动缩放线,应用程序将在生产环境中按预期工作。

另一个线索是Google App Engine控制台显示“hello”模块没有logging,并且不显示任何活动的实例。 奇怪的是, appcfg.py start hello.yaml表示它已经在运行。

回答这个问题的另一种方法是指向一个完整的模块化“手动缩放”的示例(谷歌的代码片段是不够的)。

想出我自己的问题…

将.yaml文件中的version: 123456更改为version: v123456 ,并按预期在生产中运行。

在“manual_scaling”模块类型的情况下,对于版本使用整数似乎不被支持。 也许它会使特定实例的URL不明确。