google pub sub在不同时间提取消息

时间:2018-05-09 12:12:03

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

我有一个google-pubsub api的java客户端。

我同时向pubsub发送了4条消息。

我的订阅者每小时触发一次并在pubsub上循环直到它为空。

尽管如此,我发现邮件是在不同的时间获取的,即使它们都是在同一时间发送的,并且在下一个自动订阅者同步获取之前有很长的延迟。

// A hotfix as cofman is too slow for ack
while (pubSubIsFull) {
    // Fetch messages by order
    log("before fetched messages by order");
    List<ReceivedMessage> messages = mySyncSubscriber.fetch(100000, true);

    messages = messages.stream().sorted(Comparator.comparingLong(message2 -> message2.getMessage().getPublishTime().getSeconds())).collect(Collectors.toList());

    log("fetched " + messages.size() + " messages by order");
    pubSubIsFull = messages.size() > 0;

    log("before processMessages");
    List<String> ackIds = processMessages(messages);
    log("after processMessages");
    mySyncSubscriber.sendAck(ackIds);
}
import com.google.pubsub.v1.PullRequest.Builder;

public List<ReceivedMessage> fetch(int maxMessages, boolean returnImmediately) {
    String subscriptionName = this.getSubscriptionName(this.getSubscriptionId()).toString();
    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();
}

这是pub sub中的错误吗?

我能做些什么来改变它吗?

1 个答案:

答案 0 :(得分:2)

Cloud Pub / Sub不提供订购保证。如果您发布多条消息 - 即使是相隔一段时间 - 然后再获取所有消息,则无法保证先前发布的消息将首先由订户接收。

此外,在单个响应中接收0条消息并不是确定没有消息可用的好方法。有时,即使有可用消息,响应也将包含0条消息,特别是如果returnImmediately设置为true(如my response to your other question中所述)。至少,在确定没有可用消息之前,您需要确保一段时间内的多个请求都返回0条消息。更好的方法是查询Stackdriver metric for subscription/num_undelivered_messages,它表示您的订阅尚未确认的邮件数量。