4. Event Hubs命名空间与实体创建
在 Azure 实时数据处理体系中,Event Hubs 命名空间(Namespace)是计费、配额、网络与安全策略的顶层容器,而事件中心(Event Hub)才是真正承载事件流的实体。理解“命名空间—事件中心—分区—消费者组—授权规则”这五层关系,是后续做吞吐规划、权限隔离和自动化部署的基础。本节围绕三种创建方式展开:Portal 适合交互式验证与教学演示,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 是否出现计数,若发送成功但指标为零,通常是连接字符串指向了错误实体或策略权限不足。