如果您在使用 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
指标。
如需降低重复率,请延长消息时限。
- 客户端库会自动延长时限,但您应注意,可配置的最大延长时限有默认限制。
- 如果要构建自己的客户端库,请使用
modifyAckDeadline
方法延长确认时限。
或者,如需强制 Pub/Sub 重试消息,请将 modifyAckDeadline
设置为 0。
使用过多的管理操作
如果您发现占用了过多管理操作配额,可能需要重构代码。例如,请参考下面的伪代码。在此示例中,管理操作 (GET
) 用于在尝试使用其资源之前检查是否存在订阅。GET
和 CREATE
都是管理操作:
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 }