使用Cloud Datastore初始化Go AppEngine应用程序

时间:2016-03-23 17:19:41

标签: google-app-engine go google-cloud-datastore

在GAE的golang应用程序的init()函数中,如何为我的应用程序设置初始值?

如何在init()函数中或在应用程序启动后立即从Cloud Datastore读取?据我所知,服务器无法写入本地文件系统,云数据存储是唯一的选择吗?

我需要一些全局变量和数据片段。

1 个答案:

答案 0 :(得分:2)

使用静态文件

在AppEngine上,您无权访问主机操作系统的文件系统,但您可以访问Web应用程序的文件(您具有只读权限,您无法更改它们,也无法创建应用程序文件夹中的新文件。)

所以问题是:您的应用程序的代码是否可以更改您想要读取并用于初始化的数据?或者,如果使用您的应用程序代码“静态”部署它是否正常?

如果您不需要更改它(或仅在您重新部署应用程序时),最简单的方法是将其存储为“静态”文件,作为您的webapp的一部分。您可以使用相对路径引用应用程序的文件,其中当前或工作目录是应用程序的根目录。例如。如果您的应用在其根目录中包含data文件夹(app.yaml所在的位置),并且init_values.txt文件夹中有data文件,则可以使用路径:data/init_values.txt

一个重要的注意事项:并非每个文件都可以被代码读取,这取决于应用程序配置。引自Configuring with app.yaml / Static file handlers

  

如果您有需要由应用程序代码读取的数据文件,则数据文件必须是应用程序文件,并且不能与静态文件模式匹配。

使用数据存储区

您无法使用需要Context处理程序之外的AppEngine服务(因为创建Context需要*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

但请注意:

  

..即使您的应用中启用了热身请求,您也可能会遇到loading requests

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

相关问题:

How do I store the private key of my server in google app engine?

Fetching a URL From the init() func in Go on AppEngine

Environment variables specified on app.yaml but it's not fetching on main.go