[英]How to use cloud.google.com/go/datastore with AppEngine?
[英]Initializing Go AppEngine app with Cloud Datastore
在GAE的golang应用程序的init()函数中,如何为应用程序设置初始值?
如何从init()函数中或应用程序启动后立即从Cloud Datastore中读取数据? 据我了解,服务器无法写入本地文件系统,而Cloud Datastore是唯一的选择?
我需要一些全局变量和数据片段。
在AppEngine上,您无权访问主机操作系统的文件系统,但可以访问Web应用程序的文件(您具有只读权限,不能更改它们,也不能在其中创建新文件应用程序的文件夹)。
因此,问题是:您的应用程序代码是否可以更改您想要读取并用于初始化的数据? 还是将它与应用程序的代码“静态”部署在一起就可以了吗?
如果不需要更改(或仅在重新部署应用程序时),最简单的方法是将其存储为“静态”文件,作为Web应用程序的一部分。 您可以使用相对路径来引用应用程序的文件,其中当前目录或工作目录是应用程序的根目录。 例如,如果您的应用程序在其根目录( app.yaml
所在的位置)中包含一个data
文件夹,并且该data
文件夹中有一个init_values.txt
文件,则可以使用以下路径来引用它: data/init_values.txt
。
重要注意事项:并非每个文件都能被代码读取,这取决于应用程序配置。 引用从使用app.yaml配置/静态文件处理程序进行配置 :
如果您有需要由应用程序代码读取的数据文件,则这些数据文件必须是应用程序文件,并且不能与静态文件模式匹配。
您不能使用在处理程序外部需要Context
AppEngine服务(因为创建Context
需要*http.Request
值)。 本质上,这意味着您也不能在包init()
函数中使用它们。
请注意,您可以从cron作业和添加到任务队列的任务中使用它们,因为任务和cron作业是通过发出HTTP GET请求来执行的。
您必须重组代码,以便从处理程序中调用您的初始化(例如,从数据存储中读取)。
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请求 。 预热请求在“实例化”之前,在开始为用户请求提供服务之前,将被发出。 在app.yaml
配置文件中,您可以通过在inbound_services
指令中添加-warmup
来启用预热请求:
inbound_services:
- warmup
这将导致App Engine基础结构首先向/_ah/warmup
发出GET
请求。 您可以将处理程序注册到该URL并执行初始化任务。 与其他任何请求一样,您将在预热处理程序中拥有一个http.Request
。
但请注意:
..即使您的应用中启用了预热请求,您也可能会遇到加载请求 。
这意味着在极少数情况下,可能会发生新实例不会收到预热请求的情况,因此最好也检查用户处理程序中的初始化状态。
相关问题:
如何将服务器的私钥存储在Google App Engine中?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.