4. Event Hubs命名空间与实体创建

在 Azure 实时数据处理体系中,Event Hubs 命名空间(Namespace)是计费、配额、网络与安全策略的顶层容器,而事件中心(Event Hub)才是真正承载事件流的实体。理解“命名空间—事件中心—分区—消费者组—授权规则”这五层关系,是后续做吞吐规划、权限隔离和自动化部署的基础。本节围绕三种创建方式展开:Portal 适合交互式验证与教学演示,CLI 适合可复现的脚本化操作,ARM 模板(或 Bicep)适合纳入 CI/CD 的声明式部署。三者最终落到同一套资源模型上,因此先建立资源层级认知,再分别展开操作细节。

Event Hubs 资源层级与创建方式映射 命名空间 Namespace(顶层容器) 计费单位 · 吞吐单位(TU/PU) · 网络与IP防火墙 · 私有终结点 · 配额边界 SKU:Basic / Standard / Premium / Dedicated 命名规则:全局唯一,3–50 字符,字母数字与连字符 示例:evhns-rtdata-dev-cn 事件中心 Event Hub(事件流实体) 分区数 · 消息保留期 · 捕获(Capture) · 消费者组 · 吞吐单位分配 示例:telemetry-hub,分区数 8,保留 3 天,消费者组:cg-stream、cg-batch P0 P1 P2 … P7 分区决定并行度上限,创建后不可减少 授权规则 Authorization Rules(SAS 策略) Send · Listen · Manage 三种声明组合,作用于命名空间或事件中心级别 示例:policy-send(Send)、policy-listen(Listen)、policy-manage(Manage) Portal 交互创建 适合验证与教学演示 Azure CLI 脚本创建 适合可复现的批量操作 ARM / Bicep 声明式 适合 CI/CD 与版本管理

一、命名空间与事件中心的关键参数

创建命名空间时,最先要确定的是 SKU。Basic 仅支持每命名空间 1 个消费者组、保留期最长 1 天,且不支持 Capture 与 Kafka 协议,通常只用于验证;Standard 支持 20 个消费者组、保留期 1–7 天、Capture 与 Kafka,是教学与多数生产场景的默认选择;Premium 提供处理单元(PU)与更强的隔离、动态分区伸缩;Dedicated 为独占集群。吞吐单位(Throughput Unit,TU)是 Standard 的容量单位:1 TU 约等于入口 1 MB/s、出口 2 MB/s,或每秒 1000 条 1 KB 事件。若示例中预计峰值入口为 6 MB/s,则至少需要 6 TU,并预留 1–2 TU 应对突发。

事件中心层面最关键的参数是分区数(Partition Count)。分区是并行消费的最小单位,一个分区同一时刻只能被同一消费者组内的一个消费者读取。分区数在创建时确定,Standard 下后续不可减少,因此应按“峰值吞吐 ÷ 单分区吞吐”并留出余量来估算。例如单分区约可承载 1 MB/s 入口,目标 6 MB/s 且希望 8 个消费者并行,则取 8 个分区较为合理。保留期(Retention)决定事件在被消费后仍可重读的时间窗口,Standard 为 1–7 天,需与下游重放需求匹配。

二、通过 Portal 创建

在 Portal 中搜索“Event Hubs”,进入后点击“创建”。在“基本信息”页填写订阅、资源组、命名空间名称(如 evhns-rtdata-dev-cn)、区域(如 China North 3)、定价层(Standard)与吞吐单位(6)。在“高级”页可开启自动膨胀(Auto-inflate)并设置最大 TU,用于流量突增时自动扩容。网络页可选择“所有网络”或“选定网络”,后者配合 IP 防火墙与虚拟网络规则。创建完成后进入命名空间,点击“+ 事件中心”,填写名称 telemetry-hub、分区数 8、消息保留 3 天,可选开启 Capture 并指定存储账户与容器。随后在“消费者组”中添加 cg-stream 与 cg-batch,在“共享访问策略”中分别创建 policy-send、policy-listen、policy-manage。Portal 的优势是每一步都有即时校验,适合第一次搭建时观察参数之间的约束关系。

三、通过 Azure CLI 创建

CLI 方式便于把创建过程固化为脚本。以下命令先创建资源组与命名空间,再创建事件中心、消费者组和授权规则:

az group create --name rg-rtdata-dev --location chinanorth3

az eventhubs namespace create \
  --resource-group rg-rtdata-dev \
  --name evhns-rtdata-dev-cn \
  --location chinanorth3 \
  --sku Standard \
  --capacity 6 \
  --enable-auto-inflate true \
  --maximum-throughput-units 12

az eventhubs eventhub create \
  --resource-group rg-rtdata-dev \
  --namespace-name evhns-rtdata-dev-cn \
  --name telemetry-hub \
  --partition-count 8 \
  --message-retention 3

az eventhubs eventhub consumer-group create \
  --resource-group rg-rtdata-dev \
  --namespace-name evhns-rtdata-dev-cn \
  --eventhub-name telemetry-hub \
  --name cg-stream

az eventhubs eventhub authorization-rule create \
  --resource-group rg-rtdata-dev \
  --namespace-name evhns-rtdata-dev-cn \
  --eventhub-name telemetry-hub \
  --name policy-send \
  --rights Send

az eventhubs eventhub authorization-rule keys list \
  --resource-group rg-rtdata-dev \
  --namespace-name evhns-rtdata-dev-cn \
  --eventhub-name telemetry-hub \
  --name policy-send \
  --query "primaryConnectionString" -o tsv

执行后可用 az eventhubs eventhub show 查看分区数与保留期,用 az eventhubs eventhub authorization-rule list 核对权限声明。注意 --rights 可组合,例如同时需要发送与监听时写 Send Listen,但生产上应遵循最小权限,发送端只给 Send,消费端只给 Listen,管理操作单独使用 Manage 并限制持有者。

四、通过 ARM 模板创建

ARM 模板把上述资源声明为幂等的 JSON,适合纳入 Git 与流水线。核心结构是 resources 数组中依次声明命名空间、事件中心、消费者组与授权规则,并通过 dependsOn 表达依赖。以下为精简示例:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "namespaceName": { "type": "string", "defaultValue": "evhns-rtdata-dev-cn" },
    "eventHubName": { "type": "string", "defaultValue": "telemetry-hub" }
  },
  "resources": [
    {
      "type": "Microsoft.EventHub/namespaces",
      "apiVersion": "2022-10-01-preview",
      "name": "[parameters('namespaceName')]",
      "location": "chinanorth3",
      "sku": { "name": "Standard", "tier": "Standard", "capacity": 6 },
      "properties": { "isAutoInflateEnabled": true, "maximumThroughputUnits": 12 }
    },
    {
      "type": "Microsoft.EventHub/namespaces/eventhubs",
      "apiVersion": "2022-10-01-preview",
      "name": "[concat(parameters('namespaceName'), '/', parameters('eventHubName'))]",
      "dependsOn": [ "[resourceId('Microsoft.EventHub/namespaces', parameters('namespaceName'))]" ],
      "properties": { "partitionCount": 8, "messageRetentionInDays": 3 }
    },
    {
      "type": "Microsoft.EventHub/namespaces/eventhubs/consumergroups",
      "apiVersion": "2022-10-01-preview",
      "name": "[concat(parameters('namespaceName'), '/', parameters('eventHubName'), '/cg-stream')]",
      "dependsOn": [ "[resourceId('Microsoft.EventHub/namespaces/eventhubs', parameters('namespaceName'), parameters('eventHubName'))]" ]
    },
    {
      "type": "Microsoft.EventHub/namespaces/eventhubs/authorizationRules",
      "apiVersion": "2022-10-01-preview",
      "name": "[concat(parameters('namespaceName'), '/', parameters('eventHubName'), '/policy-send')]",
      "dependsOn": [ "[resourceId('Microsoft.EventHub/namespaces/eventhubs', parameters('namespaceName'), parameters('eventHubName'))]" ],
      "properties": { "rights": [ "Send" ] }
    }
  ]
}

部署命令为 az deployment group create --resource-group rg-rtdata-dev --template-file eh.json。模板部署是幂等的,重复执行不会重复创建资源,但会覆盖被声明的属性,因此修改分区数等不可逆参数前应先确认影响。

五、权限配置与验证

权限配置的核心是最小权限与密钥轮换。发送端应用使用仅含 Send 的策略连接字符串,消费端使用仅含 Listen 的策略,管理面操作使用 Manage 并配合 Azure RBAC 限制人员范围。连接字符串应存入 Key Vault 或应用配置,避免硬编码。创建完成后建议做三项验证:一是用 az eventhubs eventhub show 确认分区数与保留期;二是用发送端 SDK 或 az eventhubs eventhub authorization-rule keys list 获取连接字符串后发送一条测试事件;三是在 Portal 的“指标”中观察 Incoming Messages 与 Incoming Bytes 是否出现计数,若发送成功但指标为零,通常是连接字符串指向了错误实体或策略权限不足。

分区数、保留期、SKU 中的部分属性在创建后不可修改或只能单向增加。建议在开发环境先用小规模参数验证脚本与模板,再对生产环境执行,避免因参数误设导致重建。
命名空间名称全局唯一,删除命名空间会同时删除其下所有事件中心、消费者组与授权规则,且不可恢复。生产环境应开启资源锁或使用软删除策略,并在删除前确认无在线消费者。