在go112标准运行时中,appengine任务队列的正确上下文是什么

时间:2019-05-22 04:30:36

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

我无法让appengine任务队列接受我向其抛出的任何上下文:

import (
    "context"
    "google.golang.org/appengine"
    "google.golang.org/appengine/taskqueue"
)

   /* snip */

    ctx:= context.Background()
    task := taskqueue.NewPOSTTask("/b/mytask", params)
    _, err = taskqueue.Add(ctx, task, "")
    if err != nil {
        return fmt.Errorf("adding background task with path %s: %v", task.Path, err)
    }

我正在go111 migration docs中声明的main.go主函数中调用appengine.Main()(但是go112 migration docs中缺少此行,因此我不确定是否需要)。

我尝试过:

context.Background()
request.Context()
appengine.NewContext(r)
appengine.BackgroundContext()
context.TODO()

所有结果均出错:

  

不是App Engine上下文

appengine.BackgroundContext()除外:

  

服务桥HTTP失败:发布   http://appengine.googleapis.internal:10001/rpc_http:拨打tcp   169.254.169.253:10001:I / O超时

3 个答案:

答案 0 :(得分:0)

将GAE标准项目从go19迁移到go112以便使用go模块时,我遇到了相同的问题。另外,我收到很多“ 502网关错误”消息。

appengine.Main()替换main()中的http.ListenAndServe()修复了上下文问题。移至 go111 而不是112可以解决其他问题。文档和示例对此并不十分清楚。

答案 1 :(得分:0)

documentation for migration to 1.12指出:

  

使用cloud Tasks使用cloudtasks软件包从Go 1.12中排队任务。您可以将任何App Engine服务用作App Engine任务的目标。

但是cloudtasks软件包文档(截至今天)为clearly marked as beta and unstable。因此,这里的答案可能是。不支持此功能。

也就是说,我在go111下的生产环境中使用了它,到目前为止没有发现任何严重的问题。

答案 2 :(得分:0)

您看到 internal.flushLog: Flush RPC: service bridge HTTP failed 是因为您在尝试运行 Go 1.12+ 运行时时有 appengine.Main() 或其他 appengine 库调用。 (我的猜测是,较旧的运行时必须调用一些 Google 内部的会计基础架构,而这不适用于 1.12“下一代”系统。)

解决方案不是降级你的 Go 版本——这样做你会错过大量的性能和安全改进,而且你无法利用新硬件——解决方案是删除所有调用到 appengine 库并改用 GCP 的云库(请参阅 https://godoc.org/cloud.google.com/go