AppEngine:使用与请求无关的上下文

时间:2017-05-03 16:02:40

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

我尝试使用PubSub和AppEngine部署API,但我收到了“不是App Engine上下文”错误,它与以下代码有关:

import (
    "golang.org/x/net/context"
    "log"

    "cloud.google.com/go/pubsub"
)

var (
    ctx                             context.Context
    pubsubClient                    *pubsub.Client
)  

func InitPubSub () {
    ctx = context.Background()

    psClient, err := pubsub.NewClient(ctx, "myproject-1234")
    if err != nil {
        log.Println("(init pub sub) error while creating new pubsub client:", err)

    } else {
        pubsubClient = psClient

    }
}

所以我从appengine包中查看了BackgroundContext函数,但它说它只适用于AppEngine灵活环境(标准环境似乎更适合我的应用程序): https://godoc.org/google.golang.org/appengine#BackgroundContext

你知道我还能使用其他功能吗?或者我应该为每个请求创建和关闭客户端吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

每个请求都应该创建一个新客户端(当客户端需要context时)。请求的context处理取消和超时等事情。因此,如果您的请求被取消,您还应该取消任何传出的API请求。客户端处理所有传出的API请求,因此它需要相同的context

App Engine标准要求使用App Engine上下文,因为它会自动处理扩展和资源。

您可以致电context.Contextg3doc),从请求中获得appengine.NewContext(req)

例如:

import (
        "net/http"

        "cloud.google.com/go/pubsub"
        "google.golang.org/appengine"
        "google.golang.org/appengine/log"
)

func pubSubHandler(w http.ResponseWriter, r *http.Request) {
    ctx := appengine.NewContext(r)
    client, err := pubsub.NewClient(ctx, "myproject-1234")
    if err != nil {
        log.Errorf(ctx, "pubsub.NewClient: %v", err)
        http.Error(w, "An error occurred. Try again.", http.StatusInternalServerError)
        return
    }
    _ = client // Use the client.
}

另一个注意事项是使用google.golang.org/appengine/log包来登录App Engine Standard,如上所述。请参阅Reading and Writing Application Logs

来自官方文档的

Building an App with Go描述了如何在App Engine Standard上构建示例应用程序。