java - 在 Java 中从 GCP 发布/订阅重试消息需要哪些设置
问题描述
我是 GCP 发布/订阅的新手,并试图重新发送未确认的消息 (ack/nack)。在 GCP 控制台仪表板的订阅中,我提到过:
在我的 java 代码中,我创建了一个订阅者
public Subscriber createSubscriber(String subscriptionId, MessageReceiver receiver) throws MessagingException {
Subscriber subscriber = null;
ProjectSubscriptionName subscriptionName = null;
String projectId = getProjectId();
if (Objects.isNull(projectId) || Objects.isNull(subscriptionId)) {
throw new MessagingException(MessagingErrorCodes.MIX90810
+ " Project Id/Subscription Id is null for subscriptionId = " + subscriptionId + " projectId= "
+ projectId, MessagingErrorCodes.MIX90810);
}
try {
subscriptionName = ProjectSubscriptionName.of(projectId, subscriptionId);
subscriber = Subscriber.newBuilder(subscriptionName, receiver).setExecutorProvider(getExecutorProvider()).build();
} catch (Exception e) {
throw new MessagingException(MessagingErrorCodes.MAX34540
+ " Error occurred while creating the subscriber for the subscriptionId = " + subscriptionId
+ "projectId " + projectId + "subscriptionName= " + subscriptionName,
MessagingErrorCodes.MAX34540, e);
}
enter code here
return subscriber;
}
我第一次在我的 receiveMessage(PubsubMessage message, AckReplyConsumer consumer) 上收到消息,但如果我不确认该消息,则不会再次收到消息。但是如果发送 nack 它会再次发送消息。
@Service
public class MyMessageReceiver implements MessageReceiver {
@Override
public void receiveMessage(PubsubMessage message, AckReplyConsumer consumer) {
System.out.println(message.getMessageId());
}
}
我是否需要提及其他配置以在不确认消息的情况下启用重试?
解决方案
关于重试策略,文档说 Pub/Sub 尝试重新传递消息,只有在确认截止日期到期或订阅者不接受消息的情况下。一旦确认截止日期过去,该消息将成为重新传递的候选者。重新交付可能不会立即进行,因为重新交付是在尽力而为的基础上执行的。
正如评论中已经提到的,在Subscriber.javaDEFAULT_MAX_ACK_EXTENSION_PERIOD
中设置为 60 分钟,这是导致此延迟的原因。Ack 截止日期将继续延长(由客户端库作为本机功能),直到达到此持续时间。意思是,未确认的消息被订阅者租用了 60 分钟,并且在此期间没有资格重新传递。用于将自定义值设置为消息的确认截止日期将延长到的最大期限。setMaxAckExtensionPeriod(Duration maxAckExtensionPeriod)
另请注意,这些值都不能保证消息不会在该时间范围内重新传递。由于网络或服务器故障,消息可能会在maxAckExtensionPeriod之前重新传递。
推荐阅读
- c# - C#:如何将任何浮点数转换为带 2 个小数的字符串,避免小数四舍五入
- spring - 使用 Maven 将 Spring Boot 项目部署到 Google App-Engine 失败
- d3.js - 从图表中删除重叠的点
- javascript - 无法读取未定义的属性 game.state.add()
- python - PyGame 窗口在 while 循环期间崩溃 - 没有错误消息
- python - 当列表中出现相同的值时如何停止循环?
- python - 当我用 img.show() 打开一个 img 记事本打开
- serialization - 它是什么?--> a:5:{i:0;i:14357;i:1;i:14358;i:2;i:14359;i:3;i:14360;i:4;i:14361;}
- arrays - 如何使用python中的split函数按降序拆分数组列表?
- ssl - 带有 Cert-Manager 的 Istio Kubernetes Ingress:版本“certmanager.k8s.io/v1alpha1”中的种类“证书”没有匹配项