PubSub REST订阅不会返回所有消息

时间:2018-02-09 12:43:09

标签: node.js google-cloud-pubsub

我们使用来自PubSub订阅的REST service API to pull消息。准备好要服务的消息被确认,在以后的执行周期中,其他未被确认的消息将被处理。

在执行周期中,我们通过returnImmediately=truemaxMessages=100pull service REST API发送请求。

在测试时,我们遇到了在每个执行周期中只返回3个“旧”消息的情况。新发布的消息从未包含在pull的请求中。我们通过监视Stackdriver监控中的Undelivered消息验证了新消息是否成功到达订阅。

  • pull REST API是否不包含所有未传递的邮件?
  • 是否会忽略maxMessages参数?
  • 如何使用REST API读取所有指定的最大消息?

说明:

我们通过向pull API发送2个并行请求并合并结果来解决此问题。我们发现了解决方法(需要并行请求)here

2018年2月22日更新

我写了an article on our blog,解释了为什么我们被迫使用PubSub服务REST API。

1 个答案:

答案 0 :(得分:2)

单个pull调用不一定会返回所有未传递的消息,尤其是当returnImmediately设置为true时。 pull承诺最多返回maxMessages,但这并不意味着如果有多条消息可用,它将始终返回maxMessages

pull API尝试平衡返回更多消息,同时保持端到端延迟较低。它宁愿快速返回一些消息,也不愿等待很长时间才能返回更多消息。需要从存储或其他服务器检索消息,因此有时所有这些消息都无法立即传送。随后的pull请求将接收稍后检索的其他消息。

如果您希望通过pull请求最大限度地接收更多邮件,请将returnImmediately设置为false。即使pull大于尚未传递的消息数,这仍然无法保证所有消息都会在单个maxMessages请求中传递。您仍应发送后续pull个请求(或者更理想的是,同时发送多个pull个请求)以检索所有消息。

或者,您应该考虑切换到Google Cloud Pub/Sub client libraries,它会处理所有这些内容并将消息传递给您指定的回调函数。