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

Posted

技术标签:

【中文标题】Google Pub/Sub 如何在 Pull 上设置读取超时【英文标题】:Google Pub/Sub How to set read timeout on Pull 【发布时间】:2016-03-02 18:26:06 【问题描述】:

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

我正在使用 gcloud-node 模块来调用 pubsub。它在后台使用request 模块进行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 在一定时间后超时拉取连接?

更新: 我可能需要稍微澄清一下我的例子。我有两个同时连接并从同一个订阅中提取的客户端。两者之间的唯一区别是第一个配置为在 30 秒后超时。由于两个客户端连接到同一个订阅,pubsub 将在它们两者之间分配消息负载。如果我在两个客户端连接 45 秒后发布消息,则 pubsub 有 50/50 的机会将消息传递给尚未超时的第二个客户端。如果我发送 10 条消息而不是只发送一条,那么第二个客户端将收到 10 条消息的子集。看起来这是因为我的客户正在进行长期投票。如果客户端断开连接,服务器将不知道并尝试根据已超时的客户端发出的请求的响应发送已发布的消息。根据我的测试,这是我观察到的行为。我想做的是能够在拉取请求中发送一个超时参数,以告诉 subpub 如果在此期间没有发布任何消息,则在 30000 毫秒后发回响应。阅读API docs,这似乎不是一个选择。

【问题讨论】:

【参考方案1】:

设置请求超时是 30 秒后超时拉取的正确方法。取消请求的存在可能不是导致其他拉取无法立即获取消息的原因。如果您的第二次拉取(未超时)设法拉取之前发布的其他消息,则它不一定要等待超时后发布的其他消息在完成之前进入。它只保证不会返回更多 超过maxMessages,而不是只返回恰好有maxMessages(如果有那么多可用)。一旦您的发布完成,稍后的一些 pull 将收到该消息,但不能保证确切何时会发生。

【讨论】:

以上是关于Google Pub/Sub 如何在 Pull 上设置读取超时的主要内容,如果未能解决你的问题,请参考以下文章

Google Cloud 上使用 Pub/Sub 的主/从模式

如何通过 Google Cloud Monitoring JAVA 客户端库获取 Pub/Sub 订阅中未确认消息的数量

如何在 Google Pub/Sub 中验证外部发布者?

如何从 Google Pub/Sub 获取 objectId、bucketId 等

如何在 google Pub/Sub 中快速发布多条消息?

如何通过转发到死信主题来限制 Google Pub/Sub 交付尝试?