Java google pub sub在不同的时间获取消息

Java google pub sub在不同的时间获取消息,java,publish-subscribe,google-cloud-pubsub,Java,Publish Subscribe,Google Cloud Pubsub,我有一个google pubsub api的java客户端 我同时向pubsub发送了4条消息 我的订阅服务器每小时触发一次,并在pubsub上循环,直到它为空 尽管如此,我看到消息是在不同的时间获取的,尽管它们都是在同一时间发送的,并且在下一次自动订户同步获取之前有很长的延迟 //cofman的热修复程序对ack来说太慢了 while(pubSubIsFull){ //按顺序提取邮件 日志(“按顺序获取消息之前”); List messages=mySyncSubscriber.fetch(1

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

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

我的订阅服务器每小时触发一次,并在pubsub上循环,直到它为空

尽管如此,我看到消息是在不同的时间获取的,尽管它们都是在同一时间发送的,并且在下一次自动订户同步获取之前有很长的延迟

//cofman的热修复程序对ack来说太慢了
while(pubSubIsFull){
//按顺序提取邮件
日志(“按顺序获取消息之前”);
List messages=mySyncSubscriber.fetch(100000,true);
messages=messages.stream().sorted(Comparator.comparingLong(message2->message2.getMessage().getPublishTime().getSeconds()).collect(Collectors.toList());
日志(“获取的”+消息.size()+“按顺序发送的消息”);
pubSubIsFull=messages.size()>0;
日志(“在处理消息之前”);
列表ackIds=processMessages(消息);
日志(“处理后消息”);
sendAck(ackIds);
}
import com.google.pubsub.v1.PullRequest.Builder;
公共列表获取(int-maxMessages,boolean-return){
String subscriptionName=this.getSubscriptionName(this.getSubscriptionId()).toString();
Builder pullRequestBuilder=PullRequest.newBuilder().setSubscription(subscriptionName).setReturnInstance(returnInstance);
如果(maxMessages!=0){
pullRequestBuilder.setMaxMessages(maxMessages);
}
PullRequest PullRequest=pullRequestBuilder.build();
PullResponse PullResponse=(PullResponse)this.subscriber.pullCallable().call(pullRequest);
返回pullResponse.getReceivedMessageList();
}
这是酒吧里的臭虫吗


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

Cloud Pub/Sub不提供订购保证。如果您发布了多条消息(甚至相隔一段时间),然后又获取了所有消息,则无法保证订阅者会首先接收到先前发布的消息


此外,在单个响应中接收0条消息并不是确定没有可用消息的好方法。有时,即使有可用的消息,响应也会包含0条消息,特别是当
returninstally
设置为true时(如中所述)。至少,在确定没有可用消息之前,您希望确保一段时间内的多个请求都返回0条消息。更好的方法是查询,它指示订阅尚未确认的消息数

你的回答有很多见解!非常感谢。跟进答案,因为我似乎有与Elad类似的要求:如果我想定期查询新消息(例如,每10秒),然后处理到某个最大值(例如,100条消息),以便在较慢的系统(DB)中执行批量更新,推荐的方法是什么?按照Stackdriver指标的指示,在处理完所有未送达的消息之前,进行同步拉取似乎是相当多的事情。有推荐的方法吗?一些背景:在AWS上,我对Kinesis/DynamoDB有一个很好的设置,所以我想知道如何使用PubSub做类似的事情。在AWS设置中,所有事件都被推送到动觉流中。批处理大小为100的Lambda处理流,规范化事件,并将它们保存到DynamoDB。与CloudWatch而不是DynamoDB的设置类似:我应该如何对PubSub订户进行这种规范化?