如果您在使用 Pub/Sub 时遇到问题,可查阅以下实用的问题排查步骤。
无法创建主题
验证您是否拥有必要的权限。如需创建 Pub/Sub 主题,您需要拥有项目的 Pub/Sub Editor (roles/pubsub.editor
) Identity and Access Management 角色。如果您没有此角色,请与您的管理员联系。
如需详细了解与主题相关的问题排查信息,请参阅以下页面:
无法创建订阅
检查您是否已完成以下操作:
验证您是否拥有必要的权限。如需创建 Pub/Sub 订阅,您需要拥有项目的 Pub/Sub Editor (roles/pubsub.editor) IAM 角色。如果您没有此角色,请与您的管理员联系。
为订阅指定了名称。
指定要将订阅附加到的现有主题的名称。
如果创建推送订阅,请在
pushEndpoint
字段中以小写字母指定https://
(而不是http://
或HTTPS://
)作为接收网址的协议。
如需详细了解订阅问题排查,请参阅以下页面:
排查权限问题
Pub/Sub 权限用于控制哪些用户和服务账号可以对您的 Pub/Sub 资源执行操作。如果权限配置错误,可能会导致权限被拒错误并中断消息流。审核日志会详细记录所有权限更改,以便您找出这些问题的根源。
如需使用审核日志排查 Pub/Sub 权限问题,请执行以下操作:
获取查看日志浏览器所需的权限。
如需了解更多信息,请参阅准备工作。
在 Google Cloud 控制台中,前往 Logs Explorer 页面。
选择一个现有的 Google Cloud 项目、文件夹或组织。
下面列出了可用于查找相关日志的过滤条件:
resource.type="pubsub_topic" OR resource.type="pubsub_subscription"
:在排查可能涉及更改主题或订阅配置或访问权限控制的任何问题时,请将此查询作为起点。您可以将其与其他过滤条件结合使用,以进一步缩小搜索范围。protoPayload.methodName="google.iam.v1.SetIamPolicy"
:如果您怀疑问题是由权限不正确或缺失所致,请使用此查询。它可帮助您跟踪谁更改了 IAM 政策以及更改内容。这对于排查问题非常有用,例如用户无法发布到主题或订阅订阅、应用被拒绝访问 Pub/Sub 资源,或访问权限控制发生意外变化。protoPayload.status.code=7
:如果您遇到与权限明确相关的错误,请使用此查询。这有助于您找出哪些操作失败以及是哪些人尝试执行这些操作。您可以将此查询与之前的查询结合使用,以确定可能导致权限被拒的具体资源和 IAM 政策更改。
分析日志,以确定事件的时间戳、进行更改的正文以及所进行的更改类型等因素。
根据从审核日志中收集的信息,您可以采取纠正措施。
订阅已被删除
您可以通过以下两种主要方式删除 Pub/Sub 订阅:
具有足够权限的用户或服务账号故意删除订阅。
订阅会在一段闲置时间后自动删除,默认时间为 31 天。如需详细了解订阅到期政策,请参阅到期期限。
如需对已删除的订阅进行问题排查,请执行以下步骤:
在 Google Cloud 控制台中,前往 Pub/Sub“订阅”页面,并验证该订阅是否已不再列出。如需详细了解如何列出订阅,请参阅列出订阅。
查看审核日志。前往 Logs Explorer。 使用过滤条件
protoPayload.methodName="google.pubsub.v1.Subscriber.DeleteSubscription"
查找已删除的订阅。检查日志,确定是有人删除了订阅,还是订阅因长期闲置而被删除。InternalExpireInactiveSubscription
表示订阅因长期无活动而被删除。如需详细了解如何使用审核日志进行问题排查,请参阅使用审核日志排查 Pub/Sub 问题。
403 (Forbidden)
个错误
如果遇到此错误,请执行以下操作:
- 确保您已在Google Cloud 控制台中启用了 Pub/Sub API。
确保发出请求的主账号对相关 Pub/Sub API 资源具有所需权限,尤其是在您使用 Pub/Sub API 进行跨项目通信时。
如果您使用的是 Dataflow,请确保
{PROJECT_NUMBER}@cloudservices.gserviceaccount.com
和 Compute Engine 服务账号{PROJECT_NUMBER}-compute@developer.gserviceaccount.com
对相关 Pub/Sub API 资源都具有所需权限。如需了解详情,请参阅 Dataflow 安全和权限。如果您使用的是 App Engine,请检查项目的权限页面,查看 App Engine 服务账号是否被列为 Pub/Sub Editor。如果不是,请将您的 App Engine 服务账号添加为 Pub/Sub Editor。通常情况下,App Engine 服务账号的格式为
<project-id>@appspot.gserviceaccount.com
。
其他常见错误代码
如需查看与 Pub/Sub API 相关的其他常见错误代码及其说明的列表,请参阅错误代码。
使用过多的管理操作
如果您发现占用了过多管理操作配额,可能需要重构代码。例如,请参考下面的伪代码。在此示例中,管理操作 (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
}
您可以使用以下代码示例以所选语言实现此模式:
Go
在尝试此示例之前,请按照 Pub/Sub 快速入门:使用客户端库中的 Go 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Go API 参考文档。
如需向 Pub/Sub 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Java
在尝试此示例之前,请按照 Pub/Sub 快速入门:使用客户端库中的 Java 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Java API 参考文档。
如需向 Pub/Sub 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Node.js
在尝试此示例之前,请按照 Pub/Sub 快速入门:使用客户端库中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Node.js API 参考文档。
如需向 Pub/Sub 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Python
在尝试此示例之前,请按照 Pub/Sub 快速入门:使用客户端库中的 Python 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Python API 参考文档。
如需向 Pub/Sub 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
C++
在尝试此示例之前,请按照 Pub/Sub 快速入门:使用客户端库中的 C++ 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub C++ API 参考文档。
如需向 Pub/Sub 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Node.js (TypeScript)
在尝试此示例之前,请按照《Pub/Sub 快速入门:使用客户端库》中的 Node.js 设置说明执行操作。 如需了解详情,请参阅 Pub/Sub Node.js API 参考文档。
如需向 Pub/Sub 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。