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在预热处理程序中有一个。
但请注意:
..您可能会遇到加载请求,即使您的应用程序中启用了预热请求。
这意味着在极少数情况下,新实例可能不会收到预热请求,因此最好也检查用户处理程序中的初始化状态。
- 1 回答
- 0 关注
- 169 浏览
添加回答
举报