繁体   English   中英

使用Cloud Datastore初始化Go 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请求来执行的。

您必须重组代码,以便从处理程序中调用您的初始化(例如,从数据存储中读取)。

使用Once.Do()实现此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请求 预热请求在“实例化”之前,在开始为用户请求提供服务之前,将被发出。 app.yaml配置文件中,您可以通过在inbound_services指令中添加-warmup来启用预热请求:

inbound_services:
  - warmup

这将导致App Engine基础结构首先向/_ah/warmup发出GET请求。 您可以将处理程序注册到该URL并执行初始化任务。 与其他任何请求一样,您将在预热处理程序中拥有一个http.Request

但请注意:

..即使您的应用中启用了预热请求,您也可能会遇到加载请求

这意味着在极少数情况下,可能会发生新实例不会收到预热请​​求的情况,因此最好也检查用户处理程序中的初始化状态。


相关问题:

如何将服务器的私钥存储在Google App Engine中?

在AppEngine上的Go中从init()函数中获取URL

在app.yaml上指定但未在main.go上获取的环境变量

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM