使用 Cloud Datastore 初始化 Go AppEngine 应用
Initializing Go AppEngine app with Cloud Datastore
在 GAE 的 golang 应用程序的 init() 函数中,如何为我的应用程序设置初始值?
如何在 init() 函数中或在应用程序启动后立即从 Cloud Datastore 读取数据?据我了解,服务器无法写入本地文件系统,云数据存储是唯一的选择?
我需要一些全局变量和数据片段..
使用静态文件
在 AppEngine 上,您无权访问主机操作系统的文件系统,但您可以访问 Web 应用程序的文件(您拥有只读权限,无法更改它们,也可以'不要在应用程序的文件夹中创建新文件)。
所以问题是:您的应用程序代码能否更改您要读取并用于初始化的数据?或者如果它与您的应用程序代码一起部署 "statically" 就可以了吗?
如果您不需要更改它(或仅在重新部署您的应用程序时),最简单的方法是将其存储为 "static" 文件作为您的网络应用程序的一部分。您可以使用相对路径引用应用程序的文件,其中当前或工作目录是应用程序的根目录。例如。如果您的应用程序在其根目录(app.yaml
所在的位置)包含一个 data
文件夹,并且 data
文件夹中有一个 init_values.txt
文件,您可以使用路径:data/init_values.txt
.
重要说明:并非每个文件都可以通过代码读取,这取决于应用程序配置。引用自 Configuring with app.yaml / Static file handlers:
If you have data files that need to be read by the application code, the data files must be application files, and must not be matched by a static file pattern.
使用数据存储
您不能在处理程序之外使用需要 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.
}
"Utilizing" 热身请求
是的,这可能会导致首次请求的服务时间大大延长。为此(为了避免这种情况),我建议您使用 Warmup requests。在新实例开始为用户请求提供服务之前,它会在 "live" 之前向新实例发出预热请求。在您的 app.yaml
配置文件中,您可以通过将 -warmup
添加到 inbound_services
指令来启用预热请求:
inbound_services:
- warmup
这将导致 App Engine 基础架构首先向 /_ah/warmup
发出 GET
请求。您可以向此 URL 注册处理程序并执行初始化任务。与任何其他请求一样,您将在预热处理程序中有一个 http.Request
。
但请注意:
..you may encounter loading requests, even if warmup requests are enabled in your app.
这意味着在极少数情况下,新实例可能不会收到预热请求,因此最好也检查用户处理程序中的初始化状态。
相关问题:
Fetching a URL From the init() func in Go on AppEngine
在 GAE 的 golang 应用程序的 init() 函数中,如何为我的应用程序设置初始值?
如何在 init() 函数中或在应用程序启动后立即从 Cloud Datastore 读取数据?据我了解,服务器无法写入本地文件系统,云数据存储是唯一的选择?
我需要一些全局变量和数据片段..
使用静态文件
在 AppEngine 上,您无权访问主机操作系统的文件系统,但您可以访问 Web 应用程序的文件(您拥有只读权限,无法更改它们,也可以'不要在应用程序的文件夹中创建新文件)。
所以问题是:您的应用程序代码能否更改您要读取并用于初始化的数据?或者如果它与您的应用程序代码一起部署 "statically" 就可以了吗?
如果您不需要更改它(或仅在重新部署您的应用程序时),最简单的方法是将其存储为 "static" 文件作为您的网络应用程序的一部分。您可以使用相对路径引用应用程序的文件,其中当前或工作目录是应用程序的根目录。例如。如果您的应用程序在其根目录(app.yaml
所在的位置)包含一个 data
文件夹,并且 data
文件夹中有一个 init_values.txt
文件,您可以使用路径:data/init_values.txt
.
重要说明:并非每个文件都可以通过代码读取,这取决于应用程序配置。引用自 Configuring with app.yaml / Static file handlers:
If you have data files that need to be read by the application code, the data files must be application files, and must not be matched by a static file pattern.
使用数据存储
您不能在处理程序之外使用需要 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.
}
"Utilizing" 热身请求
是的,这可能会导致首次请求的服务时间大大延长。为此(为了避免这种情况),我建议您使用 Warmup requests。在新实例开始为用户请求提供服务之前,它会在 "live" 之前向新实例发出预热请求。在您的 app.yaml
配置文件中,您可以通过将 -warmup
添加到 inbound_services
指令来启用预热请求:
inbound_services:
- warmup
这将导致 App Engine 基础架构首先向 /_ah/warmup
发出 GET
请求。您可以向此 URL 注册处理程序并执行初始化任务。与任何其他请求一样,您将在预热处理程序中有一个 http.Request
。
但请注意:
..you may encounter loading requests, even if warmup requests are enabled in your app.
这意味着在极少数情况下,新实例可能不会收到预热请求,因此最好也检查用户处理程序中的初始化状态。
相关问题:
Fetching a URL From the init() func in Go on AppEngine