你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

适用于 Azure 事件中心的 Kafka Streams

本文详细介绍了如何将 Kafka Streams 客户端库与 Azure 事件中心配合使用。

注意

Kafka Streams 功能仅以公共预览版为事件中心高级层和专用层提供

概述

Apache Kafka Streams 是一个仅限 Java 的客户端库,它提供一个框架,用于处理流式处理数据和针对 Kafka 主题中存储的数据生成实时应用程序。 所有处理都限于客户端范围,而 Kafka 主题在将输出写入目标主题之前充当中间数据的数据存储。

事件中心提供一个 Kafka 终结点,现有的 Kafka 客户端应用程序将该终结点用作运行你自己的 Kafka 群集的替代方案。 事件中心可与许多现有 Kafka 应用程序配合使用。 有关详细信息,请参阅适用于 Apache Kafka 的事件中心

将 Kafka Streams 与 Azure 事件中心配合使用

Azure 事件中心原生支持 AMQP 和 Kafka 协议。 但是,为了确保兼容的 Kafka Streams 行为,必须为 Kafka 客户端更新一些默认配置参数。

properties 事件中心的默认行为 修改后的 Kafka Streams 行为 说明
messageTimestampType 设置为 AppendTime 应设置为 CreateTime Kafka Streams 依赖于创建时间戳,而不是追加时间戳
message.timestamp.difference.max.ms 允许的最大值为 90 天 属性仅用于管理过去的时间戳。 将来的时间设置为 1 小时,且无法更改。 这符合 Kafka 协议规范
min.compaction.lag.ms 允许的最大值为两天
无限保留主题 每个主题分区的截断大小为 250 GB
删除无限保留主题的记录 API 未实现。 一种解决方法是可以更新主题并设置有限的保留时间。 这将在正式发布版中完成

其他注意事项

下面是要注意的一些其他事项。

  • Kafka Streams 客户端应用程序必须被授予对整个命名空间的管理、读取和写入权限,才能创建用于流处理的临时主题。
  • 临时主题和分区计入给定命名空间的配额。 预配命名空间或群集时,应考虑这些事项。
  • “偏移”存储的无限保留时间受 SKU 最长消息保留时间的限制。 检查事件中心配额,了解这些层级特定值。

其中包括更新 messageTimestampType 中的主题配置以使用 CreateTime(即事件创建时间)而不是 AppendTime(即日志追加时间)。

要替代默认行为(必需),必须在 Azure 资源管理器 (ARM) 中设置以下设置。

注意

仅显示 ARM 模板的特定部分以突出显示需要更新的配置。

{
  "parameters": {
    "namespaceName": "contoso-test-namespace",
    "resourceGroupName": "contoso-resource-group",
    "eventHubName": "contoso-event-hub-kafka-streams-test",
    ...
    "parameters": {
      "properties": {
        ...
        "messageTimestampType": "CreateTime",
        "retentionDescription": {
          "cleanupPolicy": "Delete",
          "retentionTimeInHours": -1,
          "tombstoneRetentionTimeInHours": 1
        }
      }
    }
  }
}

Kafka Streams 概念

Kafka Streams 通过 Kafka 生成者和使用者 API 提供一个简单的抽象层,用于帮助开发人员更快地开始使用实时流式处理方案。 该轻型库依赖于内部消息层的 Apache Kafka 兼容代理(如 Azure 事件中心),并管理容错本地状态存储。 借助事务 API,Kafka 流库支持丰富的处理功能,如“恰好一次处理”和“一次处理一条记录”

无序到达的记录受益于“基于事件时间的窗口操作”

注意

建议你熟悉 Kafka Streams 文档Kafka Streams 核心概念

流是 Kafka 主题的抽象表示形式。 它由一个无界限的、持续更新的不可变数据记录数据集组成,其中每个数据记录都是一个键值对。

流处理拓扑

Kafka Streams 应用程序通过由处理器拓扑表示的 DAG(有向无环图)来定义计算逻辑。 处理器拓扑由流处理器(拓扑中的节点)组成,这些处理器表示由流(拓扑中的边缘)连接的处理步骤。

流处理器可以链接到上游处理器或下游处理器,但某些特殊情况除外:

  • 源处理器- 这些处理器没有任何上游处理器,直接从一个或多个流中进行读取。 然后,它们可以链接到下游处理器。
  • 接收器处理器- 这些处理器没有任何下游处理器,必须直接写入流。

流处理拓扑可以使用 Kafka Streams DSL 或较低级别的处理器 API 来定义。

流和表的二元性

流和表是 Kafka Streams DSL 提供的两种不同但有用的抽象,用于对时序和关系数据格式进行建模,对于流处理用例,这两种格式必须共存。

Kafka 对此进行了进一步扩展,并引入了流和表之间的二元性,其中

  • 流可以被视为表的更改日志,并且
  • 表可以被视为流中每个键的最新值的快照

这种二元性允许根据用例的需要互换使用表和流。

例如

  • 将静态客户数据(建模为表)与动态事务(建模为流)连接起来,以及
  • 将日间交易者投资组合中不断变化的投资组合头寸(建模为流)与最新的市场数据馈送(建模为流)结合起来。

时间

Kafka Streams 允许使用窗口和宽限功能,以便可以引入无序数据记录,并仍将其纳入处理范围。 为了确保这种行为是确定性的,Kafka Streams 中使用了额外的时间概念。 这些设置包括:

  • 创建时间(也称为“事件时间”)- 这是事件发生和创建数据记录的时间。
  • 处理时间 - 这是流处理应用程序处理数据记录的时间(或使用时间)。
  • 追加时间(也称为“创建时间”)- 这是存储数据并将其提交到 Kafka 代理存储的时间。 这不同于创建时间,因为创建事件与代理实际引入事件之间存在时间差。

有状态操作

通过状态管理,可以实现复杂的流处理应用,如联接和聚合来自不同流的数据。 这是通过状态存储来实现的,该存储由 Kafka Streams 提供,并使用 Kafka Streams DSL 中的有状态运算符进行访问。

DSL 中的有状态转换包括:

窗口和宽限

Kafka Streams DSL 中的窗口操作允许开发人员控制如何针对给定键对记录进行分组,以执行聚合和联接等有状态操作

窗口操作还允许指定宽限期,以便为给定窗口的无序记录提供一定的灵活性。 接受适用于给定窗口并且到达时间在给定窗口之后但在宽限期内的记录。 将丢弃在宽限期结束后到达的记录。

应用程序必须利用窗口和宽限期控制来提高对无序记录的容错能力。 相应的值根据工作负载而变化,必须根据经验来确定。

处理保证

业务和技术用户试图从流处理工作负载的输出中提取关键业务见解,这对事务保证提出了很高的要求。 Kafka Streams 与 Kafka 事务协同工作,通过与 Kafka 兼容代理(如 Azure 事件中心)的底层存储系统集成,确保以原子方式写入偏移提交和状态存储更新,从而确保事务处理保证。

为了确保事务处理保证,Kafka Streams 配置中的 processing.guarantee 设置必须从默认值 at_least_once 更新为 exactly_once_v2(对于 Apache Kafka 2.5 或之后的客户端版本)或 exactly_once(对于 Apache Kafka 2.5.x 之前的客户端版本)。

后续步骤

本文介绍了适用于 Kafka 的事件中心。 若要了解详细信息,请参阅针对 Azure 事件中心的 Apache Kafka 开发人员指南

有关创建事件中心并使用 SAS 或 OAuth 对其进行访问的分步说明教程,请参阅快速入门:使用 Kafka 协议通过事件中心进行数据流式传输

此外,请参阅 GitHub 上的 OAuth 示例