Pub/Sub Lite提交偏移量异常及API调用404问题求助
解决Pub/Sub Lite ListPartitionCursors接口404错误
你的代码出现404错误的核心原因有两个:端点配置错误和客户端初始化方式不当,以下是具体修正方案:
问题分析
- 错误的端点设置:Pub/Sub Lite的CursorService使用区域专属端点(如
us-west1-pubsublite.googleapis.com),而非通用的默认端点。你代码中使用CursorServiceSettings.getDefaultEndpoint()会将请求发送到错误的服务器,导致路径不存在。 - 手动构造底层客户端易出错:直接实例化
CursorClientImpl并手动传入CursorServiceClient容易忽略区域端点的配置逻辑,增加出错概率。
修正方案
推荐方式:使用高层CursorClient封装(自动处理端点)
优先使用官方提供的高层客户端封装,它会自动配置正确的区域端点和认证,避免手动配置错误:
import com.google.cloud.pubsublite.CloudRegion; import com.google.cloud.pubsublite.ProjectNumber; import com.google.cloud.pubsublite.SubscriptionName; import com.google.cloud.pubsublite.cloudpubsub.CursorClient; import com.google.cloud.pubsublite.Partition; import com.google.cloud.pubsublite.Offset; import java.util.Map; import java.util.concurrent.ExecutionException; public class ListCursorsExample { public static void main(String[] args) throws ExecutionException, InterruptedException { // 初始化CursorClient,自动处理区域端点 try (CursorClient cursorClient = CursorClient.create( CloudRegion.of("us-west1"), ProjectNumber.of(1111111111L), SubscriptionName.of("TestSubscription") )) { // 调用listPartitionCursors Map<Partition, Offset> cursors = cursorClient.listPartitionCursors().get(); // 处理结果 for (Map.Entry<Partition, Offset> entry : cursors.entrySet()) { System.out.printf("Partition %d: Offset %d%n", entry.getKey().value(), entry.getValue().value()); } } } }
手动配置底层客户端(不推荐)
如果必须手动构造CursorServiceClient,需显式设置区域专属端点:
import com.google.cloud.pubsublite.CloudRegion; import com.google.cloud.pubsublite.ProjectNumber; import com.google.cloud.pubsublite.SubscriptionName; import com.google.cloud.pubsublite.SubscriptionPath; import com.google.cloud.pubsublite.cloudpubsub.CursorClientImpl; import com.google.cloud.pubsublite.v1.CursorServiceClient; import com.google.cloud.pubsublite.v1.CursorServiceSettings; import com.google.cloud.pubsublite.Partition; import com.google.cloud.pubsublite.Offset; import java.util.Map; import java.util.concurrent.ExecutionException; public class ManualCursorClientExample { public static void main(String[] args) throws ExecutionException, InterruptedException { String region = "us-west1"; // 构造区域专属端点 String endpoint = String.format("%s-pubsublite.googleapis.com:443", region); CursorServiceSettings settings = CursorServiceSettings.newBuilder() .setEndpoint(endpoint) .build(); try (CursorServiceClient csc = CursorServiceClient.create(settings)) { SubscriptionPath subscriptionPath = SubscriptionPath.newBuilder() .setProject(ProjectNumber.of(1111111111L)) .setLocation(CloudRegion.of(region)) .setName(SubscriptionName.of("TestSubscription")) .build(); CursorClientImpl cc = CursorClientImpl.create( CloudRegion.of(region), ProjectNumber.of(1111111111L), SubscriptionName.of("TestSubscription"), csc ); Map<Partition, Offset> cursors = cc.listPartitionCursors(subscriptionPath).get(); // 处理结果 for (Map.Entry<Partition, Offset> entry : cursors.entrySet()) { System.out.printf("Partition %d: Offset %d%n", entry.getKey().value(), entry.getValue().value()); } } } }
额外注意事项
- 检查订阅的区域、项目编号、名称是否完全匹配,避免拼写错误(比如你代码中的
TestSubsciption少了一个字母r,请确认实际订阅名)。 - 确保运行代码的服务账号拥有
pubsublite.subscriptions.get权限,否则即使路径正确也会返回权限错误。 - 始终使用
try-with-resources管理客户端资源,避免连接泄漏。
内容的提问来源于stack exchange,提问作者Siyuan Hua
相关产品推荐
相关产品推荐

