在 GAE 应用程序中连接到 PubSub
Posted
技术标签:
【中文标题】在 GAE 应用程序中连接到 PubSub【英文标题】:Connecting to PubSub inside GAE application 【发布时间】:2021-04-20 14:39:50 【问题描述】:我在 Go 中构建了一个连接到 Google PubSub 以发布消息的应用程序。它在 localhost 中完美运行(使用 pubsub 模拟器),但由于某种原因,连接在 GAE 中挂起。
挂在这段代码上(去掉了不相关的代码提高可读性)
import (
"cloud.google.com/go/pubsub"
)
client, err := pubsub.NewClient(ctx, config.Project_ID)
if err != nil
return nil, errors.Wrap(err, "failed to create client")
topic, err := client.CreateTopic(ctx, id) // HANGS HERE
这是 app.yaml
runtime: go114
instance_class: B1
manual_scaling:
instances: 1
handlers:
- url: /.*
script: auto
此外,当代码运行(并挂起)时,它会不断输出以下错误消息
internal.flushLog: Flush RPC: service bridge HTTP failed: Post "http://appengine.googleapis.internal:10001/rpc_http": dial tcp 169.254.169.253:10001: i/o timeout
似乎有些东西正在丢弃发送到 GCP 内部 API 的数据包,但我不知道为什么或如何修复它。我发现更奇怪的是我有另一个应用程序运行几乎相同的代码(并成功连接到 pubsub)。唯一的区别是,正在运行的应用程序不是 GAE 中的默认服务,而失败的应用程序是。
这似乎是网络问题,但不幸的是我无法在网上找到解决方案。
以下是应用使用的直接依赖(从go.mod中提取)
cloud.google.com/go
cloud.google.com/go/storage
github.com/dgrijalva/jwt-go
github.com/getsentry/sentry-go
github.com/go-ozzo/ozzo-validation
github.com/golang/gddo
github.com/google/uuid
github.com/gorilla/handlers
github.com/gorilla/mux
github.com/jackc/pgx
github.com/jinzhu/copier
github.com/joho/godotenv
github.com/lib/pq
github.com/ory/dockertest
github.com/pkg/errors
github.com/stretchr/testify
google.golang.org/appengine
google.golang.org/genproto
cloud.google.com/go/pubsub
github.com/satori/go.uuid
github.com/sirupsen/logrus
github.com/spf13/pflag
google.golang.org/grpc
【问题讨论】:
你能分享你的依赖吗? 应用程序是一直挂起还是在一段时间后挂起?我注意到根据您的 app.yaml 文件,您只有 1 个 B1 实例,也许您可以考虑增加实例类或实例数。如果您的应用程序总是挂起,则可能是 Go 标准运行时的限制(因为在查看 docs 后,我发现没有任何有关 Go 的信息)。 请注意,有一个相当大的simple tutorial for App Engine Flexible 可以作为您的应用程序的基础。 【参考方案1】:好吧,伙计们,我终于知道发生了什么事。愚蠢的错误。
我们使用 pubsub 模拟器在本地测试应用程序,不幸的是,我们在 GAE 应用程序中设置了 PUBSUB_EMULATOR_HOST=localhost:8085
环境。这意味着应用程序试图连接 GAE 内的模拟器,而不是真正的 Pub/Sub。由于模拟器只存在于本地,所以应用程序挂在 TCP 连接上。
至少我可以说一些事情来帮助可能有类似问题的其他人:
Pub/Sub 可在 GAE 标准环境中使用 Pub/Sub 适用于 Go 1.14(您无需降级到 1.11) 检查您的环境变量:)【讨论】:
以上是关于在 GAE 应用程序中连接到 PubSub的主要内容,如果未能解决你的问题,请参考以下文章
如何在单个 Kafka Streams 应用程序中连接到多个集群?
无法在 Spring Boot 应用程序中连接到 MongoDB