google pub-sub setMaxMessages

时间:2018-05-09 12:01:43

标签: java publish-subscribe google-cloud-pubsub

我正在使用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条消息。

1 个答案:

答案 0 :(得分:2)

当您使用同步拉取方法时,设置maxMessages字段并不能保证您将收到那么多消息,即使有超过该数量的消息也是如此。消息的端到端延迟与单个响应中返回的消息数量之间存在权衡。如果服务等待直到maxMessages可用,那么缓冲和等待的消息将具有更高的端到端延迟。<​​/ p>

单个响应中可以返回的最大消息数为1,000,无论高于maxMessages的高度如何。如果您希望您的回复更有可能包含更多消息,请确保将returnImmediately设置为false。如果此字段为true,则服务尝试尽可能快地返回,这意味着它可能不会在返回之前等待加载消息。这可能是您在某些响应中看到返回0条消息的原因。

如果您正在尝试最大限度地提高吞吐量,那么您将要使用StreamingPull,甚至更好的Cloud Pub/Sub client libraries,它们使用StreamingPull。这样,消息可以在消息可用时立即将消息传递给开放的流连接。