我们使用来自PubSub订阅的REST service API to pull消息。准备好要服务的消息被确认,在以后的执行周期中,其他未被确认的消息将被处理。
在执行周期中,我们通过returnImmediately=true
和maxMessages=100
向pull
service REST API发送单请求。
在测试时,我们遇到了在每个执行周期中只返回3个“旧”消息的情况。新发布的消息从未包含在pull
的请求中。我们通过监视Stackdriver监控中的Undelivered消息验证了新消息是否成功到达订阅。
pull
REST API是否不包含所有未传递的邮件? maxMessages
参数? 我们通过向pull
API发送2个并行请求并合并结果来解决此问题。我们发现了解决方法(需要并行请求)here。
我写了an article on our blog,解释了为什么我们被迫使用PubSub服务REST API。
答案 0 :(得分:2)
单个pull
调用不一定会返回所有未传递的消息,尤其是当returnImmediately
设置为true时。 pull
承诺最多返回maxMessages
,但这并不意味着如果有多条消息可用,它将始终返回maxMessages
。
pull
API尝试平衡返回更多消息,同时保持端到端延迟较低。它宁愿快速返回一些消息,也不愿等待很长时间才能返回更多消息。需要从存储或其他服务器检索消息,因此有时所有这些消息都无法立即传送。随后的pull
请求将接收稍后检索的其他消息。
如果您希望通过pull
请求最大限度地接收更多邮件,请将returnImmediately
设置为false。即使pull
大于尚未传递的消息数,这仍然无法保证所有消息都会在单个maxMessages
请求中传递。您仍应发送后续pull
个请求(或者更理想的是,同时发送多个pull
个请求)以检索所有消息。
或者,您应该考虑切换到Google Cloud Pub/Sub client libraries,它会处理所有这些内容并将消息传递给您指定的回调函数。