我正在使用google pubsub同步获取邮件
com.google.pubsub.v1.PullRequest.Builder pullRequestBuilder = PullRequest.newBuilder().setSubscription(subscriptionName).setReturnImmediately(returnImmediately);
if (maxMessages != 0) {
pullRequestBuilder.setMaxMessages(maxMessages);
}
PullRequest pullRequest = pullRequestBuilder.build();
PullResponse pullResponse = (PullResponse)this.subscriber.pullCallable().call(pullRequest);
return pullResponse.getReceivedMessagesList();
我在文档中看到:
setMaxMessages
public PullRequest setMaxMessages(java.lang.Integer maxMessages)
The maximum number of messages returned for this request. The Pub/Sub system may return fewer than the number specified.
Parameters:
maxMessages - maxMessages or null for none
在我的代码中,我传递MAX_INT以避免任何最大消息限制
但我看到我的java代码逐个获取消息。
跳过最大限制的正确方法是什么?
我怎么知道它不只是一个pub-sub bug?
即使pubsub中有一些消息,我有时会得到0条消息。
答案 0 :(得分:2)
当您使用同步拉取方法时,设置maxMessages
字段并不能保证您将收到那么多消息,即使有超过该数量的消息也是如此。消息的端到端延迟与单个响应中返回的消息数量之间存在权衡。如果服务等待直到maxMessages
可用,那么缓冲和等待的消息将具有更高的端到端延迟。</ p>
单个响应中可以返回的最大消息数为1,000,无论高于maxMessages
的高度如何。如果您希望您的回复更有可能包含更多消息,请确保将returnImmediately
设置为false。如果此字段为true,则服务尝试尽可能快地返回,这意味着它可能不会在返回之前等待加载消息。这可能是您在某些响应中看到返回0条消息的原因。
如果您正在尝试最大限度地提高吞吐量,那么您将要使用StreamingPull,甚至更好的Cloud Pub/Sub client libraries,它们使用StreamingPull。这样,消息可以在消息可用时立即将消息传递给开放的流连接。