我在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?存在default-allow-internal防火墙规则。
我已经使我的Compute Engine服务帐户成为Pub / Sub主题权限中的编辑和发布者。
应用程序驻留在Container Engine管理的Compute Engine实例中的Docker容器中。 Pub / Sub主题和Compute Engine实例位于同一个项目中。我可以使用google-cloud库连接到其他Cloud Platform服务,例如Datastore。我也能够在同一个项目中从App Engine实例发布到相同的Pub / Sub主题。
使用google-api-services-pubsub API库而不是谷歌云,我会有更多的运气吗?
答案 0 :(得分:2)
我目前遇到同样的问题,并在google-cloud-java issue tracker on GitHub创建了一个问题,因为我找不到它。
我们从旧google-api-services-pubsub libraries(有效)切换到new ones并获得例外。我们的Java应用程序也在Compute Engine实例上运行。
答案 1 :(得分:1)
虽然这可能是由网络问题(客户端无法连接到服务)引起的,但更典型的原因是发布速度过快。在一个紧密循环中调用发布方法是很常见的,这可以在典型请求返回的时间内创建数千到数十万。一台机器上的网络堆栈一次只会发送这么多请求,而其他的则等待执行。如果你的机器能并行发送N个请求,每个请求耗时0.1s,一分钟可以发送600N个请求。如果您以比该速度更快的速度发布,则所有其他请求都将在客户端上超时并显示 DEADLINE_EXCEEDED。
您可以通过查看 Cloud Monitoring 中的服务器端指标来确认这一点:您不会看到这些请求,只会看到成功的请求。这些请求的速率会告诉您机器的吞吐能力。
对此的解决方案是发布者流量控制:有效地限制您调用发布方法的速度。您可以通过简单的配置在大多数客户端库中执行此操作。有关详细信息,请参阅您的客户端库的 the documentation for the client library 发布者 API。例如。在 Java 中,这是一个名为 FlowControlSettings 的 Publisher BatchingSettings 属性。在 Python 中,这是直接在 PublisherOptions 中设置的。