Compartilhar via

Apache Kafka 的Azure Event Hubs是什么?

本文介绍如何使用 Azure Event Hubs 从 Apache Kafka 应用程序流式传输数据,而无需自行设置 Kafka 群集。

概述

Azure Event Hubs在事件中心提供 Apache Kafka 终结点,使用户能够使用 Kafka 协议连接到事件中心。 通常,可以从应用程序使用事件中心的 Kafka 终结点,而无需更改任何代码。 您只需修改配置,即将配置中的连接字符串更新为指向由您的事件中心公开的 Kafka 终结点,而不是指向 Kafka 集群。 然后,可以开始将使用 Kafka 协议的应用程序中的事件流式传输到事件中心(相当于 Kafka 主题)。

若要详细了解如何将 Apache Kafka 应用程序迁移到 Azure Event Hubs,请参阅 migration 指南

注意

  • 此功能仅在 **标准高级层中受支持。
  • Apache Kafka 生态系统的事件中心支持 Apache Kafka 版本 1.0 及更高版本。

Apache Kafka 和Azure Event Hubs概念映射

从概念上讲,Apache Kafka 和事件中心非常相似。 它们都是为流式处理数据生成的已分区日志,因此,客户端可以控制它要读取保留的日志的哪一部分。 下表映射 Apache Kafka 和事件中心之间的概念。

Apache Kafka 概念 事件中心概念
群集 命名空间
主题 事件中心
分区 分区
消费者组 消费者群组
Offset Offset

Azure Event Hubs支持的 Apache Kafka 功能

Kafka Stream

Kafka Streams 是流分析的客户端库,它是 Apache Kafka 开源project的一部分,但与 Apache Kafka 事件代理分开。

注意

Kafka Streams 目前处于高级层的公共预览版中。

Azure Event Hubs支持 Kafka Streams 客户端库,其中包含可用的详细信息和概念here

在使用 Azure Event Hubs 时,客户请求 Kafka Streams 支持的最常见原因,是他们对 Confluent 的“ksqlDB”产品感兴趣。 “ksqlDB”是一种专有的共享源项目,其许可协议规定,任何供应商“提供软件即服务、平台即服务、基础设施即服务或其他与 Confluent 产品或服务竞争的类似在线服务”都不被允许使用或提供“ksqlDB”支持。 实际上,如果你使用 ksqlDB,你必须亲自运营 Kafka,或者必须使用 Confluent 的云产品/服务。 许可条款还可能会影响Azure为许可证排除的用途提供服务的客户。

独立且没有 ksqlDB,Kafka Streams 的功能比许多备用框架和服务少,其中大多数框架和服务具有内置流式处理 SQL 接口,所有这些接口目前都与Azure Event Hubs集成:

Kafka 事务

注意

Kafka 事务目前在高级版中以公开预览提供。

Azure Event Hubs支持 Kafka 事务。 此处提供了有关支持和概念的更多详细信息

压缩

注意

事件中心的 Kafka 压缩目前仅在高级层中支持。

在 Apache Kafka 客户端中,客户端压缩功能通过在生产者端将多条消息压缩到一个消息中,并在消费者端解压这批消息,从而节省计算资源和带宽。 Apache Kafka 中转站将批视为一条特殊消息。

Kafka 生成者应用程序开发人员可以通过设置 compression.type 属性来启用消息压缩。 Azure Event Hubs当前支持 gzip 压缩。


Compression.type = none | gzip

虽然此功能仅支持 Apache Kafka 生产者流量和消费者流量,但 AMQP 消费者可以将压缩的 Kafka 流量作为解压缩的消息进行消费。

Apache Kafka 与 Azure Event Hubs 之间的主要区别

尽管 Apache Kafka 是你通常需要安装和操作的软件,但事件中心是一种完全托管的云原生服务。 没有需要管理和监视的服务器、磁盘或网络,也没有需要考虑或配置的中转站。 你需要创建一个命名空间(即具有完全限定的域名的终结点),然后在该命名空间中创建事件中心(主题)。

有关事件中心和命名空间的详细信息,请参阅事件中心功能。 作为云服务,事件中心使用单一稳定的虚拟 IP 地址作为终结点,因此客户端无需了解群集中代理或计算机的情况。 即使事件中心实现了相同的协议,由于这种差异,所有分区的 Kafka 流量都将通过一个可预测的终结点路由,而不需要允许群集中所有代理的防火墙访问。

事件中心的规模由你购买的吞吐量单位 (TU)处理单位的数量控制。 如果为标准层命名空间启用自动扩充功能,则当你达到吞吐量限制时,事件中心会自动纵向扩展 TU。 此功能也适用于 Apache Kafka 协议支持。 对于高级层命名空间,可以增加分配给命名空间的处理单位的数量。

Apache Kafka 是适合你的工作负载的解决方案吗?

如果你有构建使用 Apache Kafka 的应用程序的背景,那么了解 Azure Event Hubs 是包括 Azure Service BusAzure Event Grid 在内的一系列服务的一部分也很有帮助。

虽然一些提供商销售的 Apache Kafka 商业发行版可能会建议,Apache Kafka 是满足所有消息传递平台需求的一站式解决方案,但现实情况是,Apache Kafka 并未实现 competing-consumer 队列模式。 它不支持这样的发布-订阅级别,在这个级别上,订阅者可以基于服务器评估规则(不仅仅是简单的偏移量)访问传入的消息。 它没有功能来跟踪由消息启动的作业的生命周期,也无法将错误消息放入死信队列中。 所有这些功能都是许多企业消息传送方案的基础。

若要了解不同模式以及哪个服务最佳支持哪个模式之间的差异,请参阅 Azure 异步消息传递选项 指南。 作为 Apache Kafka 用户,你可以发现通过 Kafka 实现的通信路径可以比基本复杂性低得多,但通过使用事件网格或Service Bus来实现更强大的功能。

如果您需要通过 Apache Kafka 的事件中心接口无法使用的特定功能,或者您的实现模式超过了 Event Hubs 配额,您还可以在 Azure HDInsight 中运行 本地 Apache Kafka 集群

安全性和身份验证

每次您从适用于 Kafka 的事件中心发布或消费事件时,客户端都会尝试访问事件中心资源。 你希望确保使用已授权的实体来访问资源。 将 Apache Kafka 协议用于客户端时,请使用 SASL 机制设置身份验证和加密的配置。 将事件中心用于 Kafka 时,需要 TLS 加密(因为使用事件中心传输的所有数据都经过 TLS 加密)。 可以在配置文件中指定SASL_SSL选项。

Azure Event Hubs提供了多种选项来授权对您的安全资源的访问:

  • OAuth 2.0
  • 共享访问签名 (SAS)

OAuth 2.0

事件中心与Microsoft Entra ID集成,该系统提供一个符合OAuth 2.0的集中式授权服务器。 通过使用 Microsoft Entra ID,您可以使用 Azure 角色基于访问控制(Azure RBAC)向客户端身份授予精细的权限。 通过为机制指定协议 SASL_SSLOAUTHBEARER ,将此功能与 Kafka 客户端配合使用。 要了解有关定义访问范围的 Azure 角色和级别的详细信息,请参阅 使用 Microsoft Entra ID 授权访问

bootstrap.servers=NAMESPACENAME.servicebus.chinacloudapi.cn:9093
security.protocol=SASL_SSL
sasl.mechanism=OAUTHBEARER
sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required;
sasl.login.callback.handler.class=CustomAuthenticateCallbackHandler

注意

这些配置属性适用于 Java 编程语言。 有关如何使用不同编程语言将 OAuth 与适用于 Kafka 的事件中心配合使用的示例,请参阅 GitHub 上的示例

共享访问签名(SAS)

事件中心还提供共享访问签名(SAS),用于委托对 Kafka 资源的访问。 使用基于 OAuth 2.0 令牌的机制来授权访问,在安全性和易用性方面胜过 SAS。 内置角色还可以消除对基于 ACL 的授权的需求,必须对其进行维护和管理。 可以指定“SASL_SSL”作为协议,并指定“PLAIN”作为机制,通过这种方式将此功能用于 Kafka 客户端。

bootstrap.servers=NAMESPACENAME.servicebus.chinacloudapi.cn:9093
security.protocol=SASL_SSL
sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="$ConnectionString" password="{YOUR.EVENTHUBS.CONNECTION.STRING}";

重要

{YOUR.EVENTHUBS.CONNECTION.STRING} 替换为事件中心命名空间的连接字符串。 有关获取连接字符串的说明,请参阅 获取事件中心连接字符串。 下面是一个配置示例:sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="$ConnectionString" password="Endpoint=sb://mynamespace.servicebus.chinacloudapi.cn/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=XXXXXXXXXXXXXXXX";

注意

对 Kafka 客户端使用 SAS 身份验证时,在重新生成 SAS 密钥时,已建立的连接不会断开。

注意

使用 Apache Kafka 终结点时,事件中心不支持生成的共享访问签名令牌

示例

有关创建事件中心并使用 SAS 或 OAuth 访问的方法和步骤,请参阅 tutorial快速入门:使用 Kafka 协议的事件中心数据流处理

其他Azure Event Hubs功能

Apache Kafka 的 Event Hubs 功能是 Azure Event Hubs 上与 HTTP 和 AMQP 并行提供的三种协议之一。 可以使用上述任一协议进行写入,并使用任何其他协议进行读取,这样,当前的 Apache Kafka 生产者可以继续通过 Apache Kafka 进行发布,但阅读器可以从事件中心原生集成的 AMQP 接口中受益,例如 Azure 流分析或 Azure Functions。 反过来,你可以将 Azure Event Hubs 作为目标端点轻松集成到 AMQP 路由网络中,并且可以通过 Apache Kafka 集成读取数据。

此外,事件中心功能(如 Capture),通过 Azure Blob Storage 和 Azure Data Lake Storage 实现极其经济高效的长期存档,以及 Geo 灾难恢复也适用于 Kafka 事件中心功能。

幂等性

适用于 Apache Kafka 的Azure Event Hubs支持幂等生成者和幂等使用者。

Azure Event Hubs的核心原则之一是至少一次交付的概念。 此方法可确保事件始终会被传递。 这也意味着使用者可以多次接收事件,甚至反复接收事件。 因此,消费者支持幂等消费者模式是非常重要的。

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

有关 教程的详细步骤说明,介绍如何创建事件中心并使用 SAS 或 OAuth 进行访问,请参阅 快速入门:使用 Kafka 协议进行事件中心的数据流

另请参阅 GitHub 上的 OAuth 示例