Java 从Compute Engine发布到云发布/子主题时超过了截止时间

Java 从Compute Engine发布到云发布/子主题时超过了截止时间,java,google-compute-engine,google-cloud-platform,google-cloud-pubsub,Java,Google Compute Engine,Google Cloud Platform,Google Cloud Pubsub,我有一个Java应用程序在Google计算引擎实例中运行。我正在尝试使用发布消息到云发布/子主题,并且我得到了截止日期\u超过异常。代码如下所示: PubSub pubSub = PubSubOptions.getDefaultInstance().toBuilder() .build().getService(); String messageId = pubSub.publish(topic, message); 结果是: com.google.cloud.pub

我有一个Java应用程序在Google计算引擎实例中运行。我正在尝试使用发布消息到云发布/子主题,并且我得到了
截止日期\u超过
异常。代码如下所示:

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

String messageId = pubSub.publish(topic, message);
结果是:

com.google.cloud.pubsub.PubSubException:io.grpc.StatusRuntimeException:超过截止日期

研究表明,这种反应通常是由网络问题引起的。我是否需要在我的网络部分配置一些东西,以允许计算引擎访问发布/订阅?存在默认的允许内部防火墙规则

我已将我的计算引擎服务帐户设置为发布/子主题权限中的编辑器和发布者

应用程序驻留在容器引擎管理的计算引擎实例中的Docker容器中。发布/订阅主题和计算引擎实例位于同一项目中。我能够使用谷歌云库连接到其他云平台服务,比如数据存储。我还能够从同一项目中的应用程序引擎实例发布到相同的发布/订阅主题


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

我现在也遇到了同样的问题,因为我在那里找不到它


我们从旧的(有效的)切换到新的,得到了例外。我们的Java应用程序也在计算引擎实例上运行。

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

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


解决方法是发布者流控制:有效地限制调用发布方法的速度。您可以通过简单的配置在大多数客户端库中实现这一点。有关详细信息,请参阅适用于您的客户端库的publisher API。例如,在中,这是Publisher BatchingSettings的一个名为FlowControlSettings的属性。在中,这是直接在PublisherOptions中设置的。

这是瞎猜,但您发送请求的机器上的日期/时间是否准确?它似乎是准确的,是的。您在使用gcloud时是否也有同样的问题?不,我没有。我可以在该VM实例上的命令行中运行
gcloud alpha pubsub topics publish…
很好,我得到一个
messageId
作为响应。gcloud发起的消息也会传递给订阅者,而应用程序的消息永远不会传递给订阅者。我还确认,通过谷歌API服务pubsub库使用API是可行的。这似乎是谷歌云java库的一个问题。你解决了你的问题了吗?我也有同样的问题,我想知道哪个netty是与最新库兼容的。我试过
4.1.8.Final
4.1.3.Final
,但都没有成功:(