在 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 应用程序中连接到多个集群?

无法在 Python 程序中连接到 MySQL

无法在 Spring Boot 应用程序中连接到 MongoDB

Django 无法在 Docker 设置中连接到 Postgres

如何在 Qt 应用程序中连接到 MySQL 服务器

在 Java 中连接到 websocket