创建 Bigtable 订阅

本文档介绍了如何在 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 实例授予该角色。

项目

  1. 在 Google Cloud 控制台中,前往 IAM 页面。

    转到 IAM

  2. 选择包括 Google 提供的角色授权

  3. 找到 Cloud Pub/Sub 服务账号对应的行,然后点击 修改主账号

  4. 点击添加其他角色,然后选择 Bigtable 用户角色。

如需了解详情,请参阅使用控制台授予 IAM 角色

实例

  1. 在 Google Cloud 控制台中,依次前往 Bigtable > 实例页面。

    转到实例

  2. 实例页面中,选中实例名称旁边的复选框。

  3. 如果信息面板未显示,请点击显示信息面板

  4. 点击 添加主账号,然后输入服务账号标识符,格式如下:

    service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com

  5. 分配角色列表中,选择 Bigtable User

  6. 点击保存。将向主账号授予资源上的角色。

使用自定义服务账号

如果您向 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 表,然后查询该表。

  1. 创建名为 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

  2. 创建一个名为 table-1 且包含名为 data 的列族的 Bigtable 表。

    gcloud bigtable instances tables create table-1 \
      --instance=my-instance \
      --column-families=data
    
  3. 创建名为 topic-1 的 Pub/Sub 主题。

    gcloud pubsub topics create topic-1
    
  4. 创建从主题读取数据的 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。

  5. 向主题发布消息。

    gcloud pubsub topics publish topic-1 --message='{"name":"Alice"}'
    

    如果消息成功发布,则输出为消息 ID:

    messageIds:
    - 'MESSAGE_ID'
    

Bigtable 订阅会将消息数据写入 data 列族。如需查询数据,请执行以下步骤:

  1. 在 Google Cloud 控制台中,前往 Bigtable 实例页面。

    转到实例

  2. 点击名为 my-cluster-1 的实例。

  3. 在导航菜单中,点击 Bigtable Studio

  4. 查询编辑器中,运行以下 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 中监控订阅。

后续步骤