2012-07-31 44 views

回答

1

为了什么目的?

如果你想测试不同的版本,你可以使用流量拆分https://developers.google.com/appengine/docs/adminconsole/trafficsplitting

也就是说不同的版本,虽然,而不是一个具体的实例。

+0

我想看看是否有可能实现长轮询服务。像服务聊天。我需要知道客户端连接了什么实例,以便我可以通知该实例。 – Trung 2012-07-31 05:18:47

+0

请参阅https://developers.google.com/appengine/docs/java/channel/。一般来说,在更新无法预测或编写脚本的情况下,比如在人类用户之间传递信息或系统地生成事件时,使用Channel API是比轮询更好的选择。 – user1258245 2012-07-31 05:21:12

+0

谢谢。似乎是一个好的解决方案。但它的开销为1/10,000美元。需要做一些数学计算,看看这是否是一个可行的选择。 – Trung 2012-07-31 05:48:17

1

不,没有。

通常当有人问到这样的事情时,他们在应用引擎上朝着错误的方向前进。前端服务器始终处于启动和关闭状态。如果你正在设计任何依赖于特定实例的东西,那么你做错了。无论他们遇到什么样的情况,您都需要设计出可以工作的请求。

如果您必须这么做,请考虑使用后端。

+0

这并不意味着这个功能没有合法的用法。如果我想为特定实例发送特定命令(如清除内存中的缓存),这会很有用。我在[这里](http://code.google.com/p/googleappengine/issues/detail?id=8031)中为此打开了一项功能请求。 – 2012-08-29 05:42:54

0

我使用Python和日期时间标记来标识实例。这个实例ID由appengine_config.py设置。为了告知其他实例,我在memcache中使用了一个标志,这由我的webapp2请求处理程序的__init__进行检查。 我使用其他实例的信号来刷新jinja环境并重新加载动态python代码,因为我找不到其他方法。

这是一个memcache标志的例子;信令来重新加载所有动态模块,其已被设定的实例ID:“2012-12-26 16:39:50.072000”

{ u'_all': { u'dyn_reloads_dt': datetime.datetime(2012, 12, 26, 16, 39, 59, 120000), 
      u'setter_instance': '2012-12-26 16:39:50.072000'}} 

我从出演feature request:易卜拉欣阿里耶夫

7

其实有一种方式,它可以将新数据推送到应用程序的所有实例。

from google.appengine.api import modules 
instance_id = modules.get_current_instance_id() 

ref: GAE Modules Docs

+0

在Java中我想要String'instanceId = System.getProperty(“INSTANCE_ID”);'但它返回null。任何人都知道我在做什么错了? – Tom 2013-01-25 00:33:00

+1

@Tom:您好Tom,在Java中,实例ID存储在AppEngine的环境属性映射中。有关代码示例,请参阅http://stackoverflow.com/a/15111345/752918中的答案。 – 2013-02-27 13:01:53

+0

@IbrahimArief太好了。谢谢。 – Tom 2013-02-27 16:43:24

0

随着Modules来临,就可以得到当前实例ID在a more elegant way

ModulesServiceFactory.getModulesService().getCurrentInstanceId()

另外,根据this doc,您可以将请求路由专为特殊情况下通过使用URL如

http://instance.version.module.app-id.appspot.com

请注意,你需要-dot-更换点来抑制SSL证书警告你的Web客户端可能会抱怨:

http://instance-dot-version-dot-module-dot-app-id.appspot.com

相关问题