我尝试使用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
你知道我还能使用其他功能吗?或者我应该为每个请求创建和关闭客户端吗?
谢谢!
答案 0 :(得分:1)
每个请求都应该创建一个新客户端(当客户端需要context
时)。请求的context
处理取消和超时等事情。因此,如果您的请求被取消,您还应该取消任何传出的API请求。客户端处理所有传出的API请求,因此它需要相同的context
。
App Engine标准要求使用App Engine上下文,因为它会自动处理扩展和资源。
您可以致电context.Context
(g3doc),从请求中获得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上构建示例应用程序。