You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pub/Sub Lite提交偏移量异常及API调用404问题求助

解决Pub/Sub Lite ListPartitionCursors接口404错误

你的代码出现404错误的核心原因有两个:端点配置错误和客户端初始化方式不当,以下是具体修正方案:

问题分析

  1. 错误的端点设置:Pub/Sub Lite的CursorService使用区域专属端点(如us-west1-pubsublite.googleapis.com),而非通用的默认端点。你代码中使用CursorServiceSettings.getDefaultEndpoint()会将请求发送到错误的服务器,导致路径不存在。
  2. 手动构造底层客户端易出错:直接实例化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 05:24:29