2012-03-06 86 views
6

我第二次遇到此問題,我想知道是否有任何解決方案。我在Google App Engine上運行一個應用程序,該應用程序依靠通過HTTP JSON RPC與網站頻繁通信。看來GAE有一種傾向,在日誌中隨機顯示這樣的消息:要裝載用於GAE Go - 「此請求導致您的應用程序啓動一個新進程...」

「該請求引起了新的進程來啓動你的應用, 從而引起應用程序代碼第一次 因爲這個請求可能需要更長的時間,所以比使用你的應用程序的典型 請求使用更多的CPU。「

然後重置存儲在RAM中的所有變量而不發出警告。無論多次重新設置變量或將新代碼上傳到GAE,同樣的過程都會一遍又一遍地發生,但增加應用程序版本號似乎可以解決問題。

如何獲取有關此行爲的更多信息,如何避免它,並防止Golang應用程序在Google App Engine上丟失數據?

編輯:

存儲在RAM中的變量是小的類的字符串,字節,布爾變量和指針。沒有太複雜或大。

谷歌應用引擎似乎「開始一個新的進程」在幾秒鐘的重量使用的問題,這應該是不夠長的時間關閉應用程序不被使用。上傳到GAE的應用程序,其變量集和創建新進程之間的時間間隔不到一分鐘。

+0

您能澄清一下RAM中存儲的變量的性質嗎?你能緩存Memcache中的數據嗎? – kristianp 2012-03-06 05:29:00

回答

3

你可以閱讀他們的文檔在GAE情況下這裏,檢查出的性能部分:

http://code.google.com/appengine/kb/java.html

在你有小數據可用的情況下,如果它的靜態那麼你可以將其加載到內存新實例的啓動。如果它是動態數據,則應該使用它們的api將它保存到數據庫中。

我的建議保持一個GAE實例活着,要麼支付永遠在線的服務或遵循使用這裏的cron我的建議:

http://rwyland.blogspot.com/2012/02/keeping-google-app-engine-gae-instances.html

我用我稱之爲「黃金計劃」 3,7,11分鐘的cron工作。

+0

正在初始化的應用程序與正在創建的新進程之間的時間差小於1分鐘,所以問題可能與應用程序由於未在一段時間內被使用而關閉不同。 – ThePiachu 2012-03-06 07:31:27

+2

如果您有一個糟糕的設計,希望能夠在請求之間保存RAM中的狀態,則永遠不會有幫助。當您擴展以處理大量流量時,您仍然可以同時運行數十個實例,並且它們不會共享狀態。 – geoffspear 2012-03-06 12:18:02

+0

@ ThePiachu登錄到appengine網站並觀看您的實例和日誌。你可能會看到,大約5-10分鐘的空轉後,你的運行實例關閉。 GAE是一個可擴展的平臺:如果你不使用它,爲什麼要浪費資源? – rwyland 2012-03-06 15:15:57

12

您是否意識到GAE是一種基於負載自動管理實例的雲託管解決方案?這是人們使用它的主要特點和原因。

當負載增加時,GAE創建一個新的實例,當然,這個實例的所有RAM變量都是空的。

的解決方案是不期望的變量可用或將它們存儲到永久存儲在請求端(會話,內存緩存,數據存儲區),並且如果不存在在請求beginnig加載它們。

2

如果您想要使用常駐內存的長時間運行實例,則應考慮使用Backends

+0

後端現在被刪除。還有其他建議嗎? – Ajai 2016-03-29 12:21:34

相關問題