当前位置: 首页 > 知识库问答 >
问题:

每次使用应用程序引擎中的数据存储时超时

司国源
2023-03-14

我第一次使用谷歌云环境,特别是谷歌应用程序引擎和数据存储,当我在本地运行时,一切都很好。我正在通过根据文档设置环境变量GOOGLE\u APPLICATION\u凭据来验证数据存储。但一旦我部署到应用程序引擎,请求总是超时,似乎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!!!")
}

应用程序引擎日志中的错误有以下两行:

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)

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

共有2个答案

朱修真
2023-03-14

我的问题的解决方案是切换数据存储库

发件人:google.golang.org/cloud/datastore

到:"google.golang.org/appengine/datastore"

appengine/datastore似乎使用了不同的协议,因此您不必使用GOOGLE\u APPLICATION\u CREDENTIALS环境变量进行身份验证。在本地使用时,它将为不同的应用引擎服务使用dev服务器,在部署时,将为云资源使用dev服务器。

宣望
2023-03-14

数据存储包使用gRPC连接到数据存储服务。您不能在应用程序引擎上直接使用此选项,因为您不能直接建立TCP连接。

您需要使用套接字API为您制作传输控制协议:

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)))

您还可以在调试时直接调用拨号程序,以确保它能够访问数据存储。googleapis。通讯: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()
 类似资料:
  • 我们正在使用SpringSecurityACL基础设施与AppEngine数据存储相结合。我们不使用低级数据存储API,而是使用Objectify框架访问数据存储。我们需要将Spring SecurityACL模型(适用于RDBMS)转换为更适用于无模式面向对象数据存储的模型。到目前为止,我们已经完成了下面描述的两个实体。 国际计算语言学协会 id:Long 阿兰特里 sid:字符串 负责人:布尔

  • 我正在看新的谷歌云数据存储,看起来很棒。但有件事我不明白。。。它应该替代谷歌应用引擎数据存储吗?我如何在GAE内部使用它?它们之间有什么区别? 我在Java有一个GAE应用程序,它使用3个实体,每个实体都有数千行,我需要经常做连接...

  • 当我对一大群小对象(15k只有几个短字符串和布尔属性的对象)运行查询时,没有对这些对象做任何事情,我看到我的实例的内存使用量不断增加(增加了70Mb)。内存的增加看起来与查询所需的内存数据量不成比例。 我使用的循环如下所示: 为了确保这不是由于appstats造成的,我调用不记录任何统计数据。 有人知道会发生什么吗?或者关于如何调试/配置文件的任何提示? 更新1:我打开了,我看到垃圾收集器被定期调

  • ZtbCMS数据库的存储引擎 ZtbCMS所有表的存储引擎(包括创建模型)默认是: InnoDB [从v3.2.0.0] 考虑到大部分情况下: 对事务需要不高,除了支付,余额统计,收益记录等 查询远大于插入 MyISAM 本身支持FULLTEXT索引,InnoDB直到My SQL 5.6.4才支持 若需要事务需求,请自行对该表的存储引擎改为 InnoDB 阅读参考 MySQL 5.5手册 - 存储

  • 我有一个导入jar的app引擎app。在那个罐子里,我用的是GoogleClientSecrets。load()以加载client\u机密。用于使用BigQuery进行身份验证的json文件。显然,当我在localhost上部署应用程序时,应用程序引擎不喜欢我从磁盘上的某个位置读取文件。我假设,如果我把凭据放在WEBINF文件夹中,它会工作,但还没有测试,但这样任何人都可以轻松访问该文件。哪里是放

  • 我们在谷歌应用引擎(GAE)上有一个长期运行的服务。然而,过了一会儿,我们开始得到图像中的错误。代码没有变化。我不明白为什么我们会有以前没有的问题。 2020-01-05 08:31:32.704UTC-8在总共服务0个请求后,超过了2048 MB的软内存限制(2068 MB)。考虑在app.yaml.中设置一个更大的实例类 2020-01-05 08:31:32.705UTC-8此请求导致为应用