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