本文档介绍了如何在 Pub/Sub 中创建 Bigtable 订阅。借助 Bigtable 订阅,您可以将 Pub/Sub 消息直接写入 Bigtable 表。
如需详细了解此订阅类型,请参阅 Bigtable 订阅。
准备工作
您要将 Pub/Sub 消息写入到的 Bigtable 表必须已存在。如需了解详情,请参阅创建和管理表。
该表必须包含一个名为
data的列族。您可以在创建表时添加列族。如果您想将消息元数据写入表中,该表还必须具有名为
pubsub_metadata的列族。
所需的角色和权限
如需获得创建 Bigtable 订阅所需的权限,请让您的管理员为您授予项目的 Pub/Sub Editor (roles/pubsub.editor) IAM 角色。如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
此预定义角色包含创建 Bigtable 订阅所需的权限。如需查看所需的确切权限,请展开所需权限部分:
所需权限
如需创建 Bigtable 订阅,需要以下权限:
-
针对项目的
权限pubsub.subscriptions.create -
关于该主题pubsub.topics.attachSubscription
跨项目订阅
如果您在一个项目中为另一个项目中的主题创建订阅,则必须对创建订阅的项目拥有 pubsub.subscriptions.create 权限,并对相应主题拥有 pubsub.topics.attachSubscription 权限。
向服务账号授予 IAM 角色
Pub/Sub 使用 Identity and Access Management (IAM) 服务账号来访问 Google Cloud 资源。如需允许 Pub/Sub 写入 Bigtable,您必须向此服务账号授予 Bigtable User (roles/bigtable.user) 角色。
默认情况下,Pub/Sub 使用 Pub/Sub 服务代理
(service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com)。您还可以在创建 Bigtable 订阅时指定用户代管式服务账号。
使用 Pub/Sub 服务代理
如需向 Pub/Sub 服务代理授予所需的角色,请执行以下步骤。您可以针对项目或包含相应表的 Bigtable 实例授予该角色。
项目
在 Google Cloud 控制台中,前往 IAM 页面。
选择包括 Google 提供的角色授权。
找到 Cloud Pub/Sub 服务账号对应的行,然后点击 修改主账号。
点击添加其他角色,然后选择 Bigtable 用户角色。
如需了解详情,请参阅使用控制台授予 IAM 角色。
实例
在 Google Cloud 控制台中,依次前往 Bigtable > 实例页面。
在实例页面中,选中实例名称旁边的复选框。
如果信息面板未显示,请点击显示信息面板。
点击 添加主账号,然后输入服务账号标识符,格式如下:
service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com。在分配角色列表中,选择 Bigtable User。
点击保存。将向主账号授予资源上的角色。
使用自定义服务账号
如果您向 Pub/Sub 服务代理授予 Bigtable User 角色,则有权在您的项目中创建订阅的任何用户都可以写入 Bigtable 表。如果您想提供更精细的权限,请改为配置用户代管式服务账号。
如需配置用户代管式服务账号以写入 Bigtable,需要以下权限:
用户代管式服务账号必须具有 Bigtable User 角色。
Cloud Pub/Sub 服务账号必须具有用户代管式服务账号的
iam.serviceAccounts.getAccessToken权限。创建订阅的用户必须拥有用户代管式服务账号的
iam.serviceAccounts.actAs权限。
创建订阅时,请指定用户代管式服务账号。如需了解详情,请参阅创建 Bigtable 订阅。
Bigtable 表写入
本部分介绍了 Bigtable 订阅如何将 Pub/Sub 消息写入表。
消息数据
Bigtable 订阅会将 Pub/Sub 消息数据写入名为 data 的列族。
每行都包含一条消息中的数据。
行键是订阅 ID、消息 ID salt 前缀和消息 ID 的串联,格式如下:
"projects/PROJECT_NUMBER/subscriptions/SUBSCRIPTION_ID#SALT_PREFIX#MESSAGE_ID"消息数据会写入
data列族中的单个列。 相应列具有空字符串 ("") 列限定符。数据以
BYTES类型写入。相应单元格的时间戳是消息的发布时间。
邮件/消息元数据
默认情况下,订阅不会将消息元数据写入表中。 您可以选择在创建 Bigtable 订阅时启用写入元数据。
如果启用了写入元数据,订阅会将消息元数据写入名为 pubsub_metadata 的列族。在创建订阅之前,请确保您的表包含具有此名称的列族。
对于每条消息,订阅会在 pubsub_metadata 列族下写入一个新行,其中包含以下列。
| 列 | 值 | 数据类型 |
|---|---|---|
subscription_name |
订阅名称 | 字符串 |
message_id |
消息 ID | 字符串 |
attributes |
包含消息属性的 JSON 对象 | 字符串 |
创建 Bigtable 订阅
如需创建 Bigtable 订阅,请使用 gcloud beta pubsub subscriptions create 命令:
gcloud beta pubsub subscriptions create SUBSCRIPTION_ID \
--topic=TOPIC_ID \
--bigtable-table=projects/PROJECT_ID/instances/INSTANCE_ID/tables/TABLE_ID
替换以下内容:
SUBSCRIPTION_ID:订阅的名称。TOPIC_ID:要从中读取的主题的名称或 ID。PROJECT_ID:项目 ID。INSTANCE_ID:包含相应表的 Bigtable 实例的 ID。TABLE_ID:要写入的表的 ID。该表必须具有名为data的列族。
以下标志是可选的:
--bigtable-write-metadata:指定是否写入消息元数据。如果您省略此标志,订阅不会写入元数据。如需了解详情,请参阅消息元数据。--bigtable-app-profile-id=APP_PROFILE:指定用于 Bigtable 写入的应用配置文件。应用配置文件必须使用单集群路由。如果未指定此标志,则订阅会使用默认应用配置文件。--bigtable-service-account-email:指定写入 Bigtable 时要使用的服务账号。如果未指定,订阅将使用 Pub/Sub 服务代理。如需了解详情,请参阅使用自定义服务账号。
示例:从 Pub/Sub 写入 Bigtable
以下示例展示了如何创建 Bigtable 订阅、使用该订阅将 Pub/Sub 消息写入 Bigtable 表,然后查询该表。
创建名为
my-instance的新 Bigtable 实例。gcloud bigtable instances create my-instance --display-name="My instance" \ --cluster-config=id=my-cluster-1,zone=ZONE,nodes=1将 ZONE 替换为集群在其中运行的可用区。示例:
us-central1-b创建一个名为
table-1且包含名为data的列族的 Bigtable 表。gcloud bigtable instances tables create table-1 \ --instance=my-instance \ --column-families=data创建名为
topic-1的 Pub/Sub 主题。gcloud pubsub topics create topic-1创建从主题读取数据的 Bigtable 订阅。
gcloud beta pubsub subscriptions create bigtable-sub \ --topic=topic-1 \ --bigtable-table=projects/PROJECT_ID/instances/my-instance/tables/table-1将 PROJECT_ID 替换为您的 Google Cloud项目 ID。
向主题发布消息。
gcloud pubsub topics publish topic-1 --message='{"name":"Alice"}'如果消息成功发布,则输出为消息 ID:
messageIds: - 'MESSAGE_ID'
Bigtable 订阅会将消息数据写入 data 列族。如需查询数据,请执行以下步骤:
在 Google Cloud 控制台中,前往 Bigtable 实例页面。
点击名为
my-cluster-1的实例。在导航菜单中,点击 Bigtable Studio。
在查询编辑器中,运行以下 SQL 查询。
SELECT _key, JSON_VALUE(CAST(data[''] AS STRING), '$.name') AS name FROM table-1;查询结果如下所示:
+-------------------+ | _key | name | +-----------|-------+ | "ROW_KEY" | Alice | +-------------------+消息数据以
BYTES类型存储。在此示例中,数据是 JSON 字符串,因此查询可以使用 GoogleSQL JSON 函数来解析数据。
监控 Bigtable 订阅
Cloud Monitoring 提供了许多指标来监控订阅。
如需查看与 Pub/Sub 相关的所有可用指标及其说明的列表,请参阅 Pub/Sub 监控文档。
您还可以在 Pub/Sub 中监控订阅。
后续步骤
- 详细了解 Bigtable 订阅。
- 选择订阅类型。
- 排查 Bigtable 订阅问题