通过事件中心进行缩放

有两个因素会影响通过事件中心进行的缩放。

  • 吞吐量单位(标准层)或处理单位(高级层)
  • 分区

吞吐量单位

事件中心的吞吐量容量由吞吐量单位 控制。 吞吐量单位是预先购买的容量单位。 单个吞吐量是指:

  • 入口:最高每秒 1 MB 或每秒 1000 个事件(以先达到的限制为准)。
  • 出口:最高每秒 2 MB,或每秒 4096 个事件。

超出所购吞吐量单位的容量时,入口受限,返回 ServerBusyException。 出口不会出现限制异常,但仍受限于所购买吞吐量单位的容量。 如果收到发布速率异常或者预期看到更高的出口,请务必检查为命名空间购买的吞吐量单位数量。 可以在 Azure 门户的命名空间的“规模”边栏选项卡上管理吞吐量单位。 也可使用事件中心 API 以编程方式管理吞吐量单位。

吞吐量单位按小时计费,需提前购买。 购买后,吞吐量单位的最短计费时限为一小时。 最多可以为一个事件中心命名空间购买 40 个吞吐量单位,这些单位在此命名空间内的所有事件中心之间进行共享。

事件中心的自动膨胀功能通过增加吞吐量单位数进行自动纵向扩展,以便满足使用量需求 。 增加吞吐量单位数可防止出现限制情况,在这些情况下:

  • 数据入口速率超过设置的吞吐量单位数。
  • 数据出口请求速率超过设置的吞吐量单位数。

当负载的增加超过最小阈值时,事件中心服务会增加吞吐量,不会因服务器繁忙错误导致任何请求失败。

有关自动扩充功能的详细信息,请参阅自动缩放吞吐量单位

处理单位

事件中心高级层在托管的多租户 PaaS 环境中提供了卓越的性能和更好的隔离性。 高级层中的资源在 CPU 和内存级别隔离,因此每个租户工作负荷都独立运行。 此资源容器称为“处理单位”(PU)。 可以为每个事件中心高级层命名空间购买 1、2、4、8 或 16 个处理单位。

使用处理单位可以引入和流式传输的数据量取决于各种因素,例如生成者、使用者、引入和处理速率,等等。 一个处理单位可以大致提供约 5-10 MB/秒流入量和 10-20 MB/秒流出量的核心容量,由于我们有足够的分区,因此存储不是限制因素。

备注

若要详细了解配额和限制,请参阅 Azure 事件中心 - 配额和限制

分区

事件中心将发送到事件中心的事件序列组织到一个或多个分区中。 当较新的事件到达时,它们将添加到此序列的末尾。

事件中心

可以将分区视为“提交日志”。 分区保存事件数据,这些数据包含事件的主体、描述事件的用户定义属性包以及元数据(例如它在分区中的偏移量、它在流序列中的编号以及它被接受时的服务端时间戳)。

显示从旧到新的事件序列的示意图。

使用分区的优势

事件中心旨在帮助处理量较大的事件,分区通过两种方式对此提供帮助:

  • 尽管事件中心是一项 PaaS 服务,但其背后存在一个物理现实,并且维护一个保持事件顺序的日志需要将这些事件一起保存在基础存储及其副本中,这将导致出现针对此类日志的吞吐量上限。 分区允许将多个并行日志用于同一个事件中心,从而使可用的原始 IO 吞吐容量倍增。
  • 你自己的应用程序必须能够及时处理要发送到事件中心的事件量。 这可能很复杂,并且需要大量的横向扩展并行处理容量。 用于处理事件的单个进程的容量有限,因此需要多个进程。 分区是解决方案为这些进程供给容量的一种方式,它们还能确保每个事件都有一个明确的处理所有者。

分区数

分区数是在创建事件中心时指定的。 它必须介于 1 和每个定价层允许的最大分区计数之间。 有关每个层的分区计数限制,请参阅此文

建议选择你预计在该特定事件中心出现应用程序峰值负载期间至少需要的分区数量。 除了专用群集中的事件中心外,不能在创建事件中心后更改其分区计数。 创建事件中心后,可以增加专用事件中心群集中事件中心的分区计数,但当分区键到分区的映射发生更改时,流在分区之间的分布也会发生更改,因此如果应用程序中事件的相对顺序很重要,你应该尽力避免此类更改。

将分区数设置为允许的最大值很有吸引力,但请始终记住,事件流需要进行结构化,这样你才能真正利用多个分区。 如果需要跨所有事件或仅少数几个子流保持绝对顺序,则你可能无法利用多个分区。 而且,多个分区会使处理端更加复杂。

当涉及到定价时,事件中心中的分区数量并不重要。 定价取决于名称空间或专用群集的定价单位(标准层的吞吐量单位 (TU)、高级层的处理单位 (PU) 以及专用层的容量单位 (CU))数量。 例如,当命名空间设置为 1 TU 容量时,具有 32 个分区或 1 个分区的标准层的事件中心会产生完全相同的费用。 此外,还可以缩放命名空间的 TU 或 PU 或者专用群集的 CU,而不管分区计数如何。

事件到分区的映射

可以使用分区键将传入事件数据映射到特定分区,以便进行数据组织。 分区键是发送者提供的、要传递给事件中心的值。 该键通过静态哈希函数进行处理,以便分配分区。 如果在发布事件时未指定分区键,则会使用循环分配。

事件发布者只知道其分区密钥,而不知道事件要发布到的分区。 键与分区的这种分离使发送者无需了解有关下游处理的过多信息。 每个设备或用户的唯一标识就可以充当一个适当的分区键,但是,也可以使用其他属性(例如地理位置),以便将相关的事件分组到单个分区中。

通过指定分区键,可使相关事件一起保持在同一分区中,并按其到达的确切顺序排列。 分区键是派生自应用程序上下文并标识事件之间的相互关系的字符串。 分区键标识的事件序列是一个流。 分区是针对许多此类流的多路复用日志存储。

备注

尽管你可以直接向分区发送事件,但我们不建议这样做,尤其是保持高可用性至关重要时。 这种做法会将事件中心的可用性降级到分区级别。 有关详细信息,请参阅可用性和一致性

后续步骤

访问以下链接可以了解有关事件中心的详细信息: