亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 Cloud Datastore 初始化 Go AppEngine 應用

使用 Cloud Datastore 初始化 Go AppEngine 應用

Go
慕哥9229398 2021-12-27 15:47:14
在 GAE 的 golang 應用程序的 init() 函數中,如何為我的應用程序設置初始值?如何在 init() 函數中或在應用程序啟動后立即從 Cloud Datastore 讀???據我了解,服務器無法寫入本地文件系統,而 Cloud Datastore 是唯一的選擇?我需要一些全局變量和數據切片..
查看完整描述

1 回答

?
呼喚遠方

TA貢獻1856條經驗 獲得超11個贊

使用靜態文件

在 AppEngine 上,您無權訪問主機操作系統的文件系統,但您可以訪問您的 Web 應用程序的文件(您具有只讀權限,不能更改它們,也不能在其中創建新文件)應用程序的文件夾)。


所以問題是:您的應用程序代碼能否更改您想要讀取并用于初始化的數據?或者,如果它與您的應用程序代碼“靜態”部署,是否可以?


如果您不需要更改它(或僅在您重新部署應用程序時),最簡單的方法是將其存儲為“靜態”文件作為 Web 應用程序的一部分。您可以使用相對路徑來引用您的應用程序的文件,其中當前或工作目錄是您應用程序的根目錄。例如,如果您的應用程序data在其根目錄(app.yaml所在的位置)中包含一個文件夾,并且該init_values.txt文件data夾內有一個文件,您可以使用以下路徑引用它:data/init_values.txt.


一個重要的注意事項:并非每個文件都可以通過代碼讀取,這取決于應用程序配置。引用配置 app.yaml / 靜態文件處理程序:


如果您有應用程序代碼需要讀取的數據文件,則該數據文件必須是應用程序文件,并且不能與靜態文件模式匹配。


使用數據存儲

您不能使用需要Context外部處理程序的AppEngine 服務(因為創建 aContext需要一個*http.Request值)。這本質上意味著您也不能在包init()函數中使用它們。

請注意,您可以從添加到任務隊列的 cron 作業和任務中使用它們,因為任務和 cron 作業是通過發出 HTTP GET 請求來執行的。


您必須重構您的代碼,以便從處理程序調用您的初始化(例如從數據存儲區讀?。?。


使用以下方法實現此目的的示例Once.Do():


var once = sync.Once{}


func MainHandler(w http.ResponseWriter, r *http.Request) {

    ctx := appengine.NewContext(r)

    once.Do(func() { mysetup(ctx) })

    // do your regular stuff here

}


func mysetup(ctx appengine.Context) {

    // This function is executed only once.

    // Read from Datastore and initialize your vars here.

}

“利用”預熱請求

是的,這可能會導致第一個請求需要更長的時間來服務。為此(為了避免這種情況),我建議您使用Warmup requests。在新實例開始為用戶請求提供服務之前,它會在“上線”之前向新實例發出預熱請求。在您的app.yaml配置文件,你可以通過添加使預熱請求-warmup的inbound_services指令:


inbound_services:

  - warmup

這將導致 App Engine 基礎架構首先向 發出GET請求/_ah/warmup。您可以向此 URL 注冊處理程序并執行初始化任務。與任何其他請求一樣,您將http.Request在預熱處理程序中有一個。


但請注意:


..您可能會遇到加載請求,即使您的應用程序中啟用了預熱請求。


這意味著在極少數情況下,新實例可能不會收到預熱請求,因此最好也檢查用戶處理程序中的初始化狀態。


查看完整回答
反對 回復 2021-12-27
  • 1 回答
  • 0 關注
  • 193 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號