从 Compute Engine 发布到 Cloud Pub/Sub 主题时的 DEADLINE_EXCEEDED

Posted

技术标签:

【中文标题】从 Compute Engine 发布到 Cloud Pub/Sub 主题时的 DEADLINE_EXCEEDED【英文标题】:DEADLINE_EXCEEDED when publishing to a Cloud Pub/Sub topic from Compute Engine 【发布时间】:2017-03-26 01:04:57 【问题描述】:

我有一个在 Google Compute Engine 实例中运行的 Java 应用程序。我正在尝试使用 google-cloud library 将消息发布到 Cloud Pub/Sub 主题,但我收到了 DEADLINE_EXCEEDED 异常。代码如下所示:

PubSub pubSub = PubSubOptions.getDefaultInstance().toBuilder()
            .build().getService();

String messageId = pubSub.publish(topic, message);

结果是:

com.google.cloud.pubsub.PubSubException:io.grpc.StatusRuntimeException:DEADLINE_EXCEEDED

documentation 表明此响应通常是由网络问题引起的。我需要在“网络”部分进行配置以允许 Compute Engine 访问 Pub/Sub 吗?存在默认允许内部防火墙规则。

我已将我的 Compute Engine 服务帐号设为 Pub/Sub 主题权限的编辑者和发布者。

应用驻留在 Container Engine 管理的 Compute Engine 实例内的 Docker 容器中。 Pub/Sub 主题和 Compute Engine 实例在同一个项目中。我可以使用 google-cloud 库连接到其他云平台服务,例如 Datastore。我还可以从同一个项目中的 App Engine 实例发布到同一个 Pub/Sub 主题。

使用 google-api-services-pubsub API 库而不是 google-cloud 会更幸运吗?

【问题讨论】:

这是在黑暗中拍摄的,但是您发送请求的机器上的日期/时间是否准确? 它似乎是准确的,是的。 您在使用 gcloud 时是否遇到同样的问题? cloud.google.com/sdk/gcloud/reference/alpha/pubsub/topics/… 不,我不知道。我可以从该 VM 实例上的命令行很好地运行 gcloud alpha pubsub topics publish ...,我得到一个 messageId 作为响应。 gcloud 发起的消息也会传递给订阅者,而应用程序的消息永远不会这样做。 我还确认通过 google-api-services-pubsub 库使用 API 是可行的。这似乎是 google-cloud-java 库的问题。 【参考方案1】:

我现在有同样的问题,并在google-cloud-java issue tracker on GitHub 上创建了一个问题,因为我在那里找不到它。

我们从旧的 google-api-services-pubsub libraries(有效)切换到 new ones 并得到了异常。我们的 Java 应用也在 Compute Engine 实例上运行。

【讨论】:

你的问题解决了吗?我有同样的问题,我想知道哪个 netty 是与最新库兼容的。我试过4.1.8.Final4.1.3.Final 都没有工作:(【参考方案2】:

虽然这可能是由网络问题(客户端无法连接到服务)引起的,但更典型的原因是发布速度过快。在一个紧密的循环中调用发布方法是很常见的,它可以在一个典型的请求返回的时间内创建数千到数十万个。机器上的网络堆栈一次只会发送这么多请求,而其他请求则等待执行。如果你的机器能够发送 N 个并行请求,并且每个请求耗时 0.1s,那么一分钟你可以发送 600N 个请求。如果您以比该速度更快的速度发布,则客户端上的所有其他请求都将超时,并显示 DEADLINE_EXCEEDED。

您可以通过查看 Cloud Monitoring 中的服务器端指标来确认这一点:您不会看到这些请求,而只会看到成功的请求。这些请求的速率将告诉您机器的吞吐能力。

解决方案是发布者流控制:有效地限制调用发布方法的速度。您可以通过简单的配置在大多数客户端库中执行此操作。有关详细信息,请参阅您的客户端库的 the documentation for the client library 发布者 API。例如。在Java 中,这是Publisher BatchingSettings 的一个名为FlowControlSettings 的属性。在Python 中,这是直接在 PublisherOptions 中设置的。

【讨论】:

以上是关于从 Compute Engine 发布到 Cloud Pub/Sub 主题时的 DEADLINE_EXCEEDED的主要内容,如果未能解决你的问题,请参考以下文章

从 Django/Python3 部署到 Google Compute Engine Managed VM

从CD Pipeline SSH到Compute Engine VM

是否可以将目录从 Google Compute Engine 实例复制到我的本地计算机?

Google Compute Engine:无法从 gcloud 终端查询 API

将 PHP 代码从 github 部署/重新部署到 GCP Compute Engine LAMP Stack 的最佳方式 [Google 点击部署]

ImportError:没有名为 google_compute_engine 的模块