gpt4 book ai didi

google-app-engine - 每次使用 App Engine 中的数据存储都会超时

转载 作者:数据小太阳 更新时间:2023-10-29 03:06:05 28 4
gpt4 key购买 nike

我第一次使用谷歌云环境,特别是谷歌应用引擎和数据存储,当我在本地运行时一切正常。我根据文档通过设置环境变量 GOOGLE_APPLICATION_CREDENTIALS 对数据存储进行身份验证。但是一旦我部署到应用程序引擎,请求总是超时,似乎 GetAll 方法永远不会返回。以下是我的应用程序的代码:

package app

import (
"fmt"
"net/http"
"time"
"golang.org/x/net/context"
"google.golang.org/appengine"
"google.golang.org/cloud/datastore"
)

type User struct {
FirstName string
LastName string
Email string
Created time.Time
id int64
}

func init() {
http.HandleFunc("/", handler)
}

func handler(w http.ResponseWriter, r *http.Request) {
var err error
var dbClient *datastore.Client
var ctx context.Context

ctx = appengine.NewContext(r)

dbClient, err = datastore.NewClient(ctx, "app-id")//this has the real app id, not sure if this is meant to be secret
if err != nil {
fmt.Fprintf(w, "Could not create datastore client: %+v", err)
return
}
defer dbClient.Close()

var users []*User

query := datastore.NewQuery("User").Filter("Email=", "jcarm010@fiu.edu")
keys, err := dbClient.GetAll(ctx, query, &users)
if err != nil {
fmt.Fprintf(w, "Could not query users: %+v", err)
return
}

for i, key := range keys {
users[i].id = key.ID()
fmt.Fprintf(w, "%+v\n",users[i])
}
fmt.Fprintf(w, "done!!!")
}

App Engine 日志中的错误有以下两行:

This request caused a new process to be started for your application, and thus caused your application code to be loaded for the first time. This request may thus take longer and use more CPU than a typical request for your application.

Process terminated because the request deadline was exceeded. (Error code 123)

顺便说一句,这在我的本地以闪电般的速度完成,而且我的数据存储中只有一条记录。关于为什么会发生这种情况或如何调试它的任何猜测?谢谢

最佳答案

datastore 包使用 gRPC连接到数据存储服务。您不能直接在 App Engine 上使用它,因为您不能直接建立 TCP 连接。

您需要使用 sockets API 为您建立 TCP 连接:

import "google.golang.org/appengine/socket" // et al

ctx := appengine.NewContext(r)
ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
defer cancel()

dialer := func(addr string, timeout time.Duration) (net.Conn, error) {
return socket.DialTimeout(ctx, "tcp", addr, timeout)
}

client, err := datastore.NewClient(ctx, "app-id", cloud.WithGRPCDialOption(grpc.WithDialer(dialer)))

您还可以在调试时直接调用 dialer 以确保它能够按预期到达 datastore.googleapis.com:443:

conn, err := dialer("datastore.googleapis.com:443", 5*time.Second)
if err != nil {
log.Errorf(ctx, "Dial: %v", err)
http.Error(w, "Dial failed: "+err.Error(), http.StatusInternalServerError)
return
}
fmt.Fprintf(w, "Addr: %v\n", conn.RemoteAddr())
conn.Close()

关于google-app-engine - 每次使用 App Engine 中的数据存储都会超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37691904/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com