问题排查

如果您在使用 Pub/Sub 时遇到问题,可查阅以下实用的问题排查步骤。

无法创建订阅

检查您是否已完成以下操作:

  • name 字段中指定订阅名称。对于版本 v1beta2 及更高版本,订阅名称必须采用 projects/project-identifier/subscriptions/subscription-name 格式。
  • topic 字段中指定要订阅的现有主题的名称。对于版本 v1beta2 及更高版本,主题名称必须采用 projects/project-identifier/topics/topic-name 格式。
  • pushEndpoint 字段中以小写字母指定 https://(而不是 http://HTTPS://)作为接收网址的协议。

403 (Forbidden) 错误

如果遇到此错误,请执行以下操作:

  • 确保您已在 Google Cloud 控制台中启用了 Pub/Sub API。
  • 确保发出请求的主账号对相关 Pub/Sub API 资源具有所需权限,尤其是在您使用 Pub/Sub API 进行跨项目通信时。
  • 如果您使用的是 Dataflow,请确保 <projectId>@cloudservices.gserviceaccount.com 和 Compute Engine 服务账号 <projectId>-compute@developer.gserviceaccount.com 对相关 Pub/Sub API 资源都具有所需权限。如需了解详情,请参阅 Dataflow 安全和权限
  • 如果您使用的是 App Engine,请检查项目的权限页面,查看 App Engine 服务账号是否被列为编辑者。如果不是,请将您的 App Engine 服务账号添加为编辑者。通常情况下,App Engine 服务账号的格式为 <project-id>@appspot.gserviceaccount.com

处理重复项并强制重试

如果您在确认时限之前未确认消息,Pub/Sub 会重新发送该消息。因此,Pub/Sub 可能会发送重复的消息。请使用 Cloud Monitoring 监控具有 expired 响应代码的确认操作,以检测此情况。如需获取此数据,请选择 subscription/expired_ack_deadlines_count 指标。

使用 Cloud Monitoring 搜索已过期的消息确认截止期限

如需降低重复率,请延长消息时限。

  • 客户端库会自动延长时限,但您应注意,可配置的最大延长时限有默认限制。
  • 如果要构建自己的客户端库,请使用 modifyAckDeadline 方法延长确认时限。

或者,如需强制 Pub/Sub 重试消息,请将 modifyAckDeadline 设置为 0。

使用过多的管理操作

如果您发现占用了过多管理操作配额,可能需要重构代码。例如,请参考下面的伪代码。在此示例中,管理操作 (GET) 用于在尝试使用其资源之前检查是否存在订阅。GETCREATE 都是管理操作:


    if !GetSubscription my-sub {
     CreateSubscription my-sub
    }
    Consume from subscription my-sub
            

更有效的模式是尝试使用订阅中的消息(假设您可以合理地确定订阅名称)。在这种乐观方式中,您只能在发生错误时获取或创建订阅。请参考下面的示例:

    try {
      Consume from subscription my-sub
    } catch NotFoundError {
      CreateSubscription my-sub
      Consume from subscription my-sub
    }