Google Pub / Sub如何在Pull上设置读取超时

我想在订阅上设置拉取请求的读取超时。 现在唯一的select是设置returnImmediately=true或者等到pubsub返回,如果没有消息发布,似乎是90秒。

我正在使用gcloud-node模块来调用pubsub。 它使用引擎盖下的请求模块进行gcloud api调用。 我已经更新了gcloud-node / lib / pubsub / subscription.js的本地副本,将请求超时设置为30秒

 this.request({ method: 'POST', uri: ':pull', timeout: 30000, json: { returnImmediately: !!options.returnImmediately, maxMessages: options.maxResults } } 

当我这样做,我看到的行为是30秒后客户端连接将超时,但pubsub仍然打开请求。 如果我有两个客户端拉取订阅,并且其中一个客户端在30秒后超时,则会向该主题发布一条消息,剩下的正在侦听的客户端将有50/50的机会检索该消息。

有一种方法可以告诉pubsub在一段时间之后超时拔出连接吗?

更新:我可能需要澄清我的例子了一下。 我有两个同时连接的客户端,并从相同的订阅。 两者之间唯一的区别是第一个configuration为30秒后超时。 由于两个客户端连接到相同的订阅,pubsub将分布在他们两个之间的消息负载。 如果我在两个客户端连接后45秒发布消息,则pubsub会将消息传递给尚未超时的第二个客户端。 如果我发送10条消息而不是一条消息,则第二个客户端将收到10条消息的子集。 看起来这是因为我的客户进行了长时间的投票。 如果客户端断开连接,服务器不知道,并且会尝试发送已发送超时的客户端发出的请求响应的已发布消息。 从我的testing中,这是我观察到的行为。 我想要做的是能够在拉请求中发送一个超时参数,告诉子网站在30000ms之后发送一个响应,如果在这段时间内没有发布消息的话。 阅读API文档 ,这似乎不是一个选项。

设置请求超时时间是在30秒后超时的正确方法。 取消请求的存在可能不是导致其他拉不立即得到消息。 如果第二次拉(不超时)设法拉取其他已发布的消息,则在完成之前,不会等待超时后发布的附加消息。 它只保证不返回超过maxMessages ,不返回只有一次,它具有完全maxMessages (如果有很多可用)。 一旦你的发布完成,稍后拉一些将得到的消息,但没有确切的时间会发生的保证。