Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
本文介绍 Azure 事件中心的核心概念和术语。 有关概要概述,请参阅 什么是事件中心?
概念一目了然
| 概念 | Description |
|---|---|
| 命名空间 | 一个或多个事件中心的管理容器。 控制网络访问和扩展。 |
| 事件中心 | 只能追加的日志,用于存储事件。 等效于 Kafka 中的主题。 |
| 分区 | 事件中心内事件的有序顺序。 启用并行处理。 |
| 生成者/发布者 | 将事件发送到事件中心的应用程序。 |
| 消费者 | 从事件中心读取事件的应用程序。 |
| 使用者组 | 事件流的独立视图。 多个组可以单独读取相同的数据。 |
| 偏移量 | 事件在分区中的位置。 用于跟踪阅读进度。 |
| 检查点技术 | 保存当前偏移量,以便使用者可以从上次中断的位置继续。 |
Architecture
命名空间
事件中心 命名空间 是事件中心(或 Kafka 术语中的主题)的管理容器。 它通过 IP 筛选、 虚拟网络服务终结点和 专用链接等功能提供网络终结点和控制访问。
分区
事件中心将发送到事件中心的事件序列组织到一个或多个分区中。 当较新的事件到达时,它们将添加到此序列的末尾。
可以将分区视为提交日志。 分区可保存包含以下信息的事件数据:
- 事件的正文
- 描述事件的用户定义的属性包
- 元数据(如分区中的偏移量、流序列中的编号)
- 服务端接受时的时间戳
使用分区的优势
事件中心旨在帮助处理量较大的事件,分区通过两种方式对此提供帮助:
- 即使事件中心是 PaaS 服务,但其下面也存在物理现实。 维护保留事件顺序的日志要求将这些事件保存在基础存储及其副本中,这会导致此类日志存在吞吐量上限。 通过使用分区,可以将多个并行日志用于同一个事件中心,从而使可用的原始输入输出 (IO) 吞吐容量倍增。
- 你自己的应用程序必须能够及时处理要发送到事件中心的事件量。 它可能很复杂,并且需要大量的横向扩展并行处理容量。 用于处理事件的单个进程的容量有限,因此需要多个进程。 分区是您的解决方案向这些进程提供数据的方式,并确保每个事件都有明确的处理负责主体。
分区数
分区数在创建事件中心时指定。 该数值必须介于 1 和每个定价层允许的最大分区数之间。 有关每个层的分区计数限制,请参阅此文。
建议在特定事件中心的应用程序峰值负载期间,至少选择你预期需要的分区数。 对于高级层以外的层,创建事件中心后无法更改其分区计数。 对于在高级层的事件中心,可以在创建后增加分区数量,但不能减少分区数量。 分区键到分区的映射一旦发生更改,流在各分区之间的分布也会随之改变。因此,如果应用程序中的事件顺序很重要,你应该尽量避免此类更改。
将分区数设置为允许的最大值很有吸引力,但请始终记住,事件流需要进行结构化,这样你才能真正利用多个分区。 如果需要在所有事件或少数几个子流中保持绝对顺序,那么你可能无法利用多个分区。 而且,多个分区会使处理端更加复杂。
在定价方面,事件中心中具有多少个分区并不重要。 这取决于定价单位的数量(标准层的
分区是一种支持并行发布和消耗的数据组织机制。 虽然它支持并行处理和缩放,但总容量仍受命名空间的缩放分配的限制。 将扩展单元(标准层的吞吐量单元、高级层的处理单元或专用层的容量单元)与分区相平衡,以实现最佳扩展。
从工作负载概况开始:平均有效负载大小、每秒事件数,以及对吞吐量下降或延迟峰值的敏感度。 使用下面的每分区吞吐量作为起点,然后使用负载测试进行验证:
- 标准层:约 1 MB/秒的入口,每个分区的出口量约为 2 MB/秒。
- 高级和专用层:每个分区大约 1-2 MB/每秒的入站带宽和大约 2-5 MB/每秒的出站带宽。
通过将预期的入口和出口除以适用的每分区的速率,然后取其中较大值来估算分区。 如果观察到的吞吐量或延迟不符合预期,请增加分区(仅限高级层和专用层)并重新测试。
分区还设置使用者并行度上限。 上限的工作原理取决于使用者类型:
- 由
(.NET,Java)和 (Python,JavaScript) 使用的Epoch (独占)使用者 ,这是生产 AMQP 工作负载的推荐模式。 在一个使用者组中,同一时刻仅有一个 Epoch 使用者可以拥有某个特定分区。 如果部署的处理器实例数多于分区,则在现有所有者释放一个分区之前,不会分配额外的实例并处于空闲状态。 如果新的 epoch 使用者使用更高的所有者级别进行连接,则服务会断开当前所有者的连接并显示ConsumerDisconnected错误,并且新使用者接管。 - 非纪元使用者 最多 5 个非纪元接收器可以在使用者组中并发读取同一分区。 每个接收方都会看到相同的事件(扇出),因此此模式不会增加每个分区的处理吞吐量。 将纪元使用者连接到分区会断开该分区上所有非纪元使用者的连接。
-
Kafka 使用者 Kafka 使用者使用组协调协议(
group.id)而不是 AMQP 纪元,但分区所有权模型是等效的:每个分区一次分配给使用者组中的一个使用者成员。 当新成员加入或现有成员离开时,组会重新平衡并重新分配分区分配。 如果使用者成员数多于分区,则多余的成员不会收到任何分配,并且会保持空闲状态,直到将来重新平衡释放分区。 若要减少由于暂时性断开连接而导致的不必要的重新平衡,请为每个使用者实例设置唯一的group.instance.id(静态成员身份)。
实际上,分区数等于每个消费者组的最大并行消费者数,无论使用的是 AMQP 纪元消费者还是 Kafka 消费者。 在规划横向扩展时,应将这个因素考虑到分区计数中。
如果应用程序具有与特定分区的相关性,则增加分区数并不有益。 有关详细信息,请参阅可用性和一致性。
事件到分区的映射
可以使用分区键将传入事件数据映射到特定分区,以便进行数据组织。 分区键是发送者提供的、要传递给事件中心的值。 该键通过静态哈希函数进行处理,创建分区分配。 如果在发布事件时未指定分区键,则会使用循环分配。
事件发布者只知道其分区密钥,而不知道事件要发布到的分区。 键与分区的这种分离使发送者无需了解有关下游处理的过多信息。 每个设备或用户的唯一标识就可以充当一个适当的分区键,但是,也可以使用其他属性(例如地理位置),以便将相关的事件分组到单个分区中。
通过指定分区键,可使相关事件保持在同一分区中,并按其到达的确切顺序排列。 分区键是派生自应用程序上下文并标识事件之间的相互关系的字符串。 分区键标识的事件序列是一个流。 分区是针对许多此类流的多路复用日志存储。
注意事项
尽管你可以直接向分区发送事件,但我们不建议这样做,尤其是保持高可用性至关重要时。 这种做法会将事件中心的可用性降级到分区级别。 有关详细信息,请参阅可用性和一致性。
事件生成者
生成者(或发布者)是将事件发送到事件中心的任何应用程序。
发布选项
| 方法 | Description |
|---|---|
| Azure SDK | .NET、 Java、 Python、 JavaScript、 Go |
| REST API | 轻型客户端的 HTTP POST 请求 |
| Kafka 客户端 | 在没有代码更改的情况下使用现有的 Kafka 生成者 |
| AMQP 1.0 | 任何 AMQP 客户端(如 Apache Qpid) |
关键行为
- 批处理或单独:一次发布事件或分批发布事件。 每次发布操作最多 1 MB。
- 分区键:指定分区键以将同一分区中的相关事件分组,确保有序传递。
- 授权:使用 Microsoft Entra ID(OAuth2)或共享访问签名(SAS)进行访问控制。
发布者策略
发布者策略可在拥有许多独立发布者时实现精细控制。 每个发布者都使用唯一标识符:
//<my namespace>.servicebus.chinacloudapi.cn/<event hub name>/publishers/<my publisher name>
发布者名称必须与用于身份验证的 SAS 令牌匹配。 使用发布者策略时, PartitionKey 必须与发布者名称匹配。
事件使用者
使用者是从事件中心读取事件的任何应用程序。 事件中心使用 拉取模型——消费者请求事件,而不是将事件推送给他们。
使用者组
使用者组是事件流的独立视图。 多个使用者组可以同时读取相同的事件中心,每个组都跟踪自己的位置。
| Guideline | 建议 |
|---|---|
| 每个分区的读取器数 | 使用者组中每个分区有一个活动读取器(特殊情况下最多 5 个) |
| 默认组 | 每个事件中心都有一个默认使用者组 ($Default) |
| 多个应用程序 | 为每个应用程序创建单独的使用者组(分析、存档、警报) |
//<my namespace>.servicebus.chinacloudapi.cn/<event hub name>/<Consumer Group #1>
//<my namespace>.servicebus.chinacloudapi.cn/<event hub name>/<Consumer Group #2>
偏移量
偏移量是事件在分区中的位置, 将其视为游标。 使用者使用偏移量来指定开始读取的位置。 可以从以下开始:
- 特定偏移值
- 时间戳
- 流的开头或结尾
检查点
检查点 是指消费者保存其当前偏移量的时刻。 这使得:
- 恢复:如果使用者断开连接,它将从最后一个检查点恢复
- 故障转移:新的消费者实例可以从上一个实例停止的位置继续接管
- 重播:通过指定以前的偏移量来处理历史事件
重要
在 AMQP 中,检查点是使用者的责任。 事件中心服务提供偏移量,但使用者必须存储检查点。
使用 Azure Blob 存储作为检查点存储时,请遵循以下建议:
- 对每个使用者组使用单独的容器。 可以使用同一存储帐户,但每个组使用一个容器。
- 不要将存储帐户用于任何其他用途。
- 不要将容器用于任何其他用途。
- 在部署的应用程序所在的同一区域中创建存储帐户。 如果应用程序位于本地,请尝试选择最近的区域。
在 Azure 门户的“存储帐户”页上的“Blob 服务”部分,确保禁用以下设置。
- 分层命名空间
- Blob 软删除
- 版本控制
事件处理程序客户端
Azure SDK 提供智能使用者客户端,用于自动处理分区管理、负载均衡和检查点:
| 语言 | 客户 |
|---|---|
| .NET | EventProcessorClient |
| Java | EventProcessorClient |
| Python | EventHubConsumerClient |
| JavaScript | EventHubConsumerClient |
事件数据结构
每个事件都包含:
- 正文:事件有效负载
- 偏移量:分区中的位置
- 序列号:分区内的顺序
- 用户属性:自定义元数据
- 系统属性:服务分配的元数据(排队时间等)
数据管理
事件保留
根据基于时间的保留策略自动删除事件。
| 层 | 违约 | 最大值 |
|---|---|---|
| 标准 | 1 小时 | 7 天 |
| 高级 | 1 小时 | 90 天 |
| 专属 | 1 小时 | 90 天 |
要点:
- 无法显式删除事件
- 保留政策的更改适用于现有事件
- 当保留期到期时,事件就变得不可用
注意事项
事件中心是实时流式处理引擎,而不是数据库。 对于长期存储,请使用事件中心捕获将事件存档到 Azure 存储、Azure Synapse。
事件中心捕获
捕获 自动将流式处理数据保存到 Azure Blob 存储或 Azure Data Lake Storage。 配置最小大小和时间范围以控制捕获频率。
| Format | Description |
|---|---|
| Avro | 捕获数据的默认格式 |
| Parquet | 通过 Azure 门户中的无代码编辑器提供 |
日志压缩
日志压缩 仅保留每个唯一密钥的最新事件,而不是使用基于时间的保留。 用于维护当前状态而不存储完整历史记录。
协议
事件中心支持多个协议,以便跨不同的客户端类型灵活。
| 协议 | 发送 | 接收 | 最适用于 |
|---|---|---|---|
| AMQP 1.0 | 是的 | 是的 | 高吞吐量、低延迟、持久连接 |
| Apache Kafka | 是的 | 是的 | 现有 Kafka 应用程序(版本 1.0+) |
| HTTPS | 是的 | 否 | 轻型客户端、受防火墙限制的环境 |
协议比较
- AMQP:需要持久性双向套接字。 初始成本较高,但频繁操作时性能更好。 由 Azure SDK 使用。
- Kafka:本机支持意味着现有 Kafka 应用程序无需更改代码即可工作。 只需重新配置引导服务器,使其指向你的事件中心命名空间。
- HTTPS:用于发送的简单 HTTP POST。 没有收到支持。 适合偶尔低量发布。
有关 Kafka 集成详细信息,请参阅 Apache Kafka 的事件中心。
存取控制
Microsoft Entra ID
Microsoft Entra ID 通过基于角色的访问控制(RBAC)提供 OAuth 2.0 身份验证。 分配内置角色来控制访问:
| 角色 | Permissions |
|---|---|
| Azure 事件中心数据所有者 | 对发送和接收事件的完全访问权限 |
| Azure 事件中心数据发送方 | 仅发送事件 |
| Azure 事件中心数据接收器 | 仅接收事件 |
有关详细信息,请参阅 使用 Microsoft Entra ID 授权访问。
共享访问签名 (SAS)
SAS 令牌在命名空间或事件中心级别提供范围限定的访问权限。 SAS 令牌是从 SAS 密钥生成的,通常仅授予 发送 或 侦听 权限。
有关详细信息,请参阅 共享访问签名身份验证。
应用程序组
应用程序组允许您为共享安全上下文(SAS 策略或 Microsoft Entra 应用程序 ID)的客户端应用程序集合定义资源访问策略(例如流控)。