2012-07-31 43 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

相關問題