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

标签 javascript node.js google-cloud-pubsub

我想为订阅设置拉取请求的读取超时。现在唯一的选择是设置 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 ,这似乎不是一个选择。

最佳答案

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

关于javascript - Google Pub/Sub 如何在 Pull 上设置读取超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33976227/

相关文章:

javascript - 有没有办法防止JS中的Date对象溢出天/月?

javascript - 将 ldapjs 与 Bluebird promise 一起使用

logging - kubernetes中的集中式应用程序日志记录

google-cloud-platform - 如何在发布/订阅发布消息上触发 google composer DAG?

javascript - 单击选择元素,然后单击一个选项

javascript - 在调整窗口大小时运行代码

javascript - Jquery 不会影响表中的元素/类

node.js - 在 jade 中导入 CSV/JSON

jquery - 将服务器端变量发送到客户端node.js和socket.io

java - 修改异步订阅者中的确认期限