什么是Apache Kafka®?

Apache Kafka®是什么?

2022年6月9日 – 二零二二年六月九日 èr èr liù yuè jiǔ rì)

什么是Apache Kafka®?

在有关Kafka和流媒体的话题上,你有过困惑吗?在这篇充满信息和资源的帖子中,让我们学习一些基本知识吧。

本页面是Apache Kafka®的入门指南。

    • Apache Kafkaとは?

 

    • イベントストリーミングとは何ですか?

 

    • イベント駆動型アーキテクチャとは?

 

    • マイクロサービスとは?

 

    • Apache Kafkaはどこに位置するのか?

 

    • Apache Kafkaはどのように機能するのか?

 

    • Apache Kafkaのアプローチの利点は?

 

    Apache Kafka中心のアーキテクチャを構築するには?

……而且,可能还有更多你还没有想到的事情!

在这个帖子中

1. Apache Kafka的基本概念
2. 在事件驅動架構中使用Apache Kafka的優勢
3. Kafka的工作原理
4. 什麼是事件流處理
5. Apache Kafka在您的架構中的應用
6. Apache Kafka的API介面
7. 使用Apache Kafka構建微服務
8. 使用Apache Kafka實現事件驅動架構的不同方式
9. 使用Apache Kafka更新遺留架構
10. 管理Apache Kafka
11. Kafka與數據安全性
12. 在Aiven上開始使用Apache Kafka

阿帕奇卡夫卡:基础版

定义和用途

Apache Kafka通常被描述为事件流平台(如果不知道是什么也许这会有帮助)。Apache Kafka只是一种将数据从一个地方移动到另一个地方的手段。这正是使得Apache Kafka成为数据基础设施的瑞士军刀的原因。

Apache Kafka是一种可以用于自己的应用程序之间、应用程序与数据存储(如PostgreSQL和Amazon S3)之间,或者数据存储之间进行数据传输的工具。由于Apache Kafka可以让应用程序之间相互独立,所以一个应用程序可以在不等待其他应用程序处理的情况下传递数据。

尝试Apache Kafka的最简单方法是注册一个托管服务并进行尝试。为此,请直接访问Aiven上的”Getting started with Apache Kafka”。

Apache Kafka是一种简单的粘合剂吗?

基本上,Apache Kafka的架构非常简单,但这正是它强大的原因——它可以产生清晰的架构边界,而不是增加复杂性。作为一个广泛使用的开源产品,Apache Kafka也有许多客户端和工具选项。无论是高级API和库,用于构建自己的应用程序,还是用于现成的数据存储之间的“粘合剂”,又或者是用于展示Apache Kafka内部发生的情况的便捷管理界面,生态系统中已经有可用的资源。(而且,这些管理界面非常重要。由于Apache Kafka在规模扩大时很难管理已经臭名昭著,完善的PaaS可以提供安全感,将重点放在应用程序本身上)

某种意义上,Apache Kafka可以说是一种类似消息传递系统和数据库的交叉产品。它既共享了消息队列的功能,又与数据库有所不同。几乎所有系统都可以作为生产者或消费者进行操作,这意味着Apache Kafka的核心用途是实现系统之间对话和数据共享。不需要复杂的系统连接器或管道网络。这一点不仅对数据传递的速度和可靠性有重要意义,也对Kafka适用的用例范围具有广泛意义。

Apache Kafka的概念和术语

想要更多术语集吗?请查看Apache Kafka的关键概念!

Apache Kafka在事件驱动的架构中的优点。

以前,在Aiven Blog中我们稍微介绍了Apache Kafka的优点,现在让我们简单解释一下为什么要在事件驱动的数据架构中使用Apache Kafka。

通过结构来加速

曾经我们必须要选择一个高速的消息平台或是一个耐久性较好的消息平台。因为在过去,”高速”通常意味着消息只存在于内存中的实现方式,将消息写入磁盘被嘲笑为太慢了。但Apache Kafka通过重新思考存储的使用方法改变了一切。当消息被放置在主题中,并且主题只被放置在附加的分区中时,就能拥有高速而又耐久的消息平台。

然后压缩

Kafka的吞吐量之所以快速的另一个原因是,Kafka本身不关心数据的结构。但是,生产者和消费者需要就数据结构达成一致。通常情况下,这由一个名为“模式注册表”(例如Karapace)的另一个组件来处理。在这里,生产者(或系统架构师)可以存储消息的结构,而消费者可以读取该结构,并预测给定主题消息中包含哪些字段等。如果可能的话,这也可以用于消息压缩。如果字段名称已存在于模式注册表中,则无需将其与每个消息一起发送。

因此,Kafka作为可扩展且容错的发布-订阅消息平台已经在Spotify、LinkedIn、Square、Twitter等大型互联网公司几乎无所不在。

迅速进入,迅速退出

由于Kafka将数据的写入和读取分离,因此吞吐量也很快。数据不需要在最终目的地接收,只需由生产者写入到代理中即可。同样地,消费者可以在方便时读取数据,不会对生产者造成困扰。

未来性取决于可扩展性。

卡夫卡的可伸缩性提供了具体的商业优势。其分区日志模型可将数据分散到多个代理服务器上,使得大量数据可以同时驻留在同一平台上的不同服务器上。此外,利用MirrorMaker 2可以轻松实现卡夫卡的地理容错性,使数据在两个不同的集群(可能位于不同区域或不同云上)之间进行复制。

通过复制来保证安全性

如果進行適當的設定,Kafka可以在伺服器、資料中心和雲端之間複製資料,即使伺服器或區域發生故障,資料也能夠保持安全。通過為每個主題設定複製,Kafka能夠追蹤哪些伺服器擁有資料的“所有者”,以及在發生故障時哪些伺服器擁有可用的副本。儘管在問題發生後手動恢復Kafka的資料可能沒有意義,但還是需要注意是否符合設定要求,例如“複製因子”。

请参阅数据和灾难恢复的详细信息。

Kafka 是如何运作的?

在使用事件驱动的世界中,如果使用Kafka,它将把每个事件视为不同的消息。在这种情况下,事件总是发生在特定的时间(时间戳),与特定的主题(键)相关,并描述了关于主题(值)发生了什么。它还可以包含附加信息(元数据/头信息)。

假设

    • 2022年2月2日16:37(タイムスタンプ)、Tania’s Deli(メタデータ)でプルオ ートサンドイッチ(キー)が購入された(値)。

 

    2022年2月3日(タイムスタンプ)、Tania’s Deli(メタデータ)でプルオ ートサンドイッチ(キー)が10個(値)配達された。

酒吧/分店 /

事件由称为生产者的客户端应用程序写入Kafka,也就是发布。其他应用程序被称为消费者,从Kafka读取事件。

这个被称为发布-订阅模型(pub/sub),生产者不需要关注或担心正在读取事件的消费者。

卡夫卡将事件流整理成几个主题。主题基本上是带有类别名称的数据源,并且通常会被分成多个分区以进行扩展。生产者可以将事件记录添加到指定主题中的事件序列中进行写入。

话题消费-抵消的重要性

消費者在指定的偏移量(主题中的记录编号)为起点,从特定的主题消费记录。这样一来,就可以轻松地异步消费记录并保持正确的顺序。通常情况下,消费者(或者消费者组)最后已知的偏移量也会保存在Apache Kafka中,因此当消费者在某种中断之后重新连接时,可以无缝地从中断的位置继续消费。

Kafka主题的结构。主题是带有类别名称的数据流,这里通过分区来加速吞吐量。

制作人总是在主题队列的末尾填写数据。随后,消费者根据设置的偏移量读取数据,以保持事件的顺序。

事件流式是什么?

如果将Kafka视为事件流平台,那么什么是事件流呢?事件流是指服务以连续的流形式发布事件,以便其他系统可以在其他位置读取和处理,就像它在盒子上写的那样。重要的是,事件按顺序发生,事件的生产者不需要关心谁正在读取什么。这是一种将不同应用程序相互隔离的出色方法,每个应用程序都可以专注于其最擅长的事情。

换句话说,我们并不是在客厅观看百老汇音乐剧《猫》的现场演出。事件流媒体是在家通过事件驱动架构进行的活动。

事件流式处理有什么用途?

事件流技术用于将主动执行任务的应用程序(例如从传感器读取数据或信用卡消费)与观察并根据任务结果采取行动的应用程序(例如关闭空调开关、发货)进行分离。以下是一些常见的用法介绍:

    • インフラを監視し、異常を検出する。(Aivenのやり方を見る!)

 

    • 関連するビジネスプロセスのトリガー – 例えば、誰かが新しいアカウントを登録すると、バックグラウンドで不正検出器をトリガーします。

 

    • リアルタイム・カウンター、移動平均などのメトリクス – フィンテックや気候変動アプリケーションなどでの応用例

 

    • ダッシュボードの作成 – トラフィック監視やリーダーボードのように、人間が数字に目を走らせたい場所ならどこでも。

 

    • 受信したイベント・ストリームから、オフライン分析やクエリのための長期ストレージへのデータ移動。

 

    イベント駆動型アーキテクチャ(EDA)の実現

事件驱动型架构的使用示例。

事件驱动架构经常用于大量数据迅速输入的应用程序。社交媒体、在线购物、物联网应用程序等都是很好的例子,而且在规模较大时还可能包括库存管理等方面。

请查看使用Kafka中心架构的案例研究页面。

在架构中的Apache Kafka

Apache Kafka的位置是在哪里?简单来说,它位于所有系统的中心。生产者和消费者有多个开源选项,其中许多都有连接到Kafka的现有连接器。请记住,Kafka本身并不执行应用程序逻辑,它只是一个有序存储的消息。

通常情况下,Apache Kafka作为一种管道运行,可以将数据从一个地方流式传输到另一个地方(或多个地方)。消费者可以选择从主题的最新消息开始(仅获取后续新增的消息),从主题的开头开始(获取主题中剩余的消息数量),或者在中间选择。Kafka会跟踪主题上的消息位置,称为”偏移量”,并在最后添加新消息。消费者会跟踪上次看到的(或即将看到的)偏移量,但具体细节通常被隐藏在客户端使用的库中。

在你的架构中使用的Apache Kafka

Apache Kafka生态系统和connect02 B

Apache Kafka API: 连接到Kafka

尽管没有什么太令人惊讶的,但 Kafka 提供了通过 API 与其他系统进行接口交互的功能。Kafka 的 Java 客户端提供了 5 个核心 API:

    • トピックやブローカーのようなKafkaオブジェクトの検査と管理を行うAdmin API

トピックへの書き込み(パブリッシング)を行うProducer API。
トピックを読む(購読する)ためのConsumer API

Kafka Streams API は、アプリケーションやマイクロサービスに対して、より高度なストリーム処理機能へのアクセスを提供する。

Kafka Connect API 外部システムやアプリケーションへのインポート・エクスポート・コネクタを作成します。

连接Apache Kafka所使用的API以及如何进行操作,取决于所使用的技术、所进行的活动(消息生成、消息消费、Kafka代理管理等),以及对连接的“高级程度”(是否要在代码中指定有关消息/分区/头部的具体细节,是否要追踪消费者最新的偏移量,以及如何描述流应如何处理并配置消息流以使用库,是否希望使用Kafka以连接其他数据存储,而无需编写任何代码)的要求。

与一些生产者和消费者

低水平的库

为了完全控制数据流入和流出到Kafka主题,提供了可在各种编程语言中使用的客户端库。Apache Kafka项目本身管理着Java API,但其他常用语言还有以下库:

    • Go 用 Sarama

 

    • Go 用 Kafka-go

 

    • Kafka-python(Python用)

C/C++用Librdkafka (およびGo、Pythonなどのラッパー)

这些消费者可以将特定的分区作为消息的目标,将任意的字节发送到消息体中,或者使用任意的数据结构作为键。请注意,大多数情况下需要仔细同步生产者和消费者之间的操作。否则,消费者可能会误解消息(例如,可能位于意外的分区中,或者不符合预期的结构)。

高级客户端库

当使用较高级的库时,这些库通常可以使用更标准的选项。例如,可以根据消息键的哈希自动选择分区,或者使用模式注册表来确保消息结构符合预期。

对于消费者来说,一个主要的关注点就是要追踪消费者处理过的消息流中的位置。低级别的消费者可能会将自己的偏移量保存在某个地方(例如保存在ZooKeeper中,尽管Kafka自身正在逐渐远离ZooKeeper),但一般而言,最好让Kafka进行管理。默认情况下,Kafka使用名为”consumer_offsets”的专用主题来处理这个问题。

更高级别的客户端库

当进入更高级别时,即使有多个运行应用程序的服务器,也通常需要协调多个不同实例的应用程序,以确保每条消息只被处理一次。Kafka允许将消费者组模块化为一个实体,来调整每个应用程序从哪个主题消费消息,消费到哪个偏移量,并实现在应用程序发生故障时进行负载均衡。

当应用程序连接到Kafka,并请求从指定主题获取消费者时,可以声明自己是特定消费者组的成员,或者是消费者组部分的链接。根据属于同一消费者组的其他应用程序数量,在分区的子集中从适当的偏移量传递消息。

真的是高水平的客户

可以选择一个高级客户端来简化整个消息处理过程,而不是处理每个消息的细节。

流处理

Kafka Streams 是一个 Java 库,可以将应用程序中的消息流建模化处理。您可以在代码中创建流畅的流水线,并定义转换的流(例如,“从消息中提取这些字段”,“将消息与来自数据库表的查找结果组合”,“如果该字段包含大于10的数字,则将消息发布到另一个流并触发警报”等)。

Apache Kafka 连接器

使用Apache Kafka Connect可以创建到Kafka的单一源管道和从Kafka到单一接收器管道。对于Kafka而言,Kafka Connect并不是特殊的东西,只是一个外部应用程序,用于生成和消费消息。但需要注意的是,它是一种方便的方法,可以将数据导入到外部数据存储(例如PostgreSQL数据库)中,或者从外部数据存储中提取数据。

Apache Kafka Connect是一个托管一个或多个”连接器”的应用程序,它本身被分类为两个类别之一。”连接器”可以从外部源提取数据并将其发布到Kafka主题中作为”源”,也可以从Kafka主题消费数据并将其推送到外部某处作为”汇”。有时Kafka被纯粹用作两个外部数据存储之间数据传输的中转,用于移动数据。

使用Kafka Connect可以对每个消息的消息字段进行简单的转换。

您想了解Aiven提供的Kafka连接器吗?请查看Aiven的Apache Kafka连接器列表,这是开发者面向的文档。

源头连接器的例子
    • リレーショナル・データベースからデータを取り出します。これには様々な実装があり、一般的なものとしては、読み取り専用のレプリカデータベースのふりをするDebezium(例えばCDCを使用)や、AivenのJDBCソースがある。一度にテーブル全体を繰り返し浚渫したり、IDやタイムスタンプのようなインクリメントされるカラムをたどって、何が変更されたかを把握することができる。

 

    • AWS S3 バケットの変更を監視する。

 

    例えば、Lenses.io の Stream Reactor MQTT コネクタ など。
连接器的例子
    • リレーショナル・データベースへのデータ書き込み

 

    • 外部APIの呼び出し

 

    • 何かが起こったことをクライアントに通知するためのWebhookの送信

 

    イベントのデータウェアハウスへのストリーミング保存と分析

如果没有现成的连接器可以连接到Kafka系统的话

可以使用Kafka Connect API来创建。

消息模式的调整

由于Kafka将生产者和消费者分开,因此消除了关于消息结构达成共识的机会。生产者如何得知可以理解消费者发布的消息呢?

没有机会调整不同应用程序期望的领域,或者特定领域是否期望实际整数,或者是否期望包含整数的字符串。

为了解决这个问题,通常会使用像 Karapace 这样的外部工具。该工具作为特定主题发布的消息模式的存储库。发布者将包含所有字段及其数据类型的消息模式写入注册表,消费者则读取模式并根据其进行期望值的调整。

如果模式不符合预期,可以引发异常并且不消费来自该话题的消息,也可以设置一个标志来表示模式正在演变,可能需要进行软件升级。

具有消息模式的其他优点

具有消息模式的好处还有其他。模式的演化是必要的,当您首次编写软件时,很少完全了解未来的需求,但模式注册表会告诉您新模式是否与旧版本兼容(或强制执行!)。例如,如果新模式版本只添加字段而不删除字段,则即使消费者仍不熟悉新字段的处理方式,他们也有很高的可能性能理解消息。

另一个优点是消费者无需在每个消息中发送字段名。当使用保留字段顺序的序列化格式(例如Avro代替JSON)时,生产者可以向注册表传达例如”第一个字段是数值ID,第二个字段是用户名”的信息。

消費者已经知道最初的字段不是用户名。这种格式与字段按顺序排列的要求相反。可以使用模式注册表的Kafka客户端,根据消息内的数据和注册表模式,透明地为应用程序重新创建完整的消息结构。

一般的的架构注册表包括开源的Karapace和Confluent Schema Registry。

使用Apache Kafka构建微服务。

由于Apache Kafka擅长解耦应用程序之间的通信,因此通常被放置在微服务架构的核心位置。这意味着应用程序被拆分成多个小型应用程序,每个应用程序专注于自己的任务,并且通常对其他部分没有意识。使用Kafka的微服务可以成为消费者、生产者,或者往往同时扮演两者角色,它们可以使用Kafka接收数据或指令,将结果发布到Kafka供其他应用程序使用,或者保存到数据仓库中。

微服务架构(https://aiven.io/case-studies/aiven-for-apache-kafka-helps-alef-education)在使每个应用程序更简单且可以根据需要进行扩展的同时,也给整体带来了复杂性。现在存在多个不同的应用程序,而不是单一的软件。单独测试它们很简单,但它们之间的相互作用需要一个完整的集成测试套件。如果没有仔细规划,看似独立的应用程序很快会意外地相互依赖,一个应用程序开始遇到困难或出现致命错误时,周围的其他应用程序就会像多米诺骨牌一样倒下。重新控制这种情况很复杂,因此需要努力保持每个微服务的独立性。

但是,通过巧妙地使用Apache Kafka,可以比外观看起来更简单地实现这一点。通过与Karapace等架构注册表的结合,可以将意外的消息控制在微服务之内,通过优秀的集成测试,可以保持对应用程序运行状况的深入了解。

请参考”How are your microservices talking”了解有关构建微服务架构时的挑战和机会的更多信息。

使用Apache Kafka实现的事件驱动架构:不同的选择

由于Apache Kafka与许多应用程序紧密地集成在一起,因此基于Kafka的架构有许多不同的变体。让我们看看以下的例子:

    • FlinkとKafkaによるストリーミングSQLパイプラインの構築

 

    • Kafka + SnowflakeによるニアリアルタイムELT

 

    データストリーミングパイプラインの最適化

卡夫卡柱状作品视频链接框架

通过使用Apache Kafka来更新传统架构。

Kafka是一种很好的选项,用于支持数据库迁移。然而,Kafka的用途不仅局限于迁移: 它可以将旧体系结构的组件无缝地集成在一起,并实现扩展和扩容。同时,还可以轻松地将新类型的组件与现有组件连接起来。

以下内容是我们之前准备的…

    • 古いアプリからデータベースへのアーキテクチャをKafka用に更新する

 

    • レガシーアーキテクチャを近代化しながらイベントデータをストリーミング

 

    • 機械式スロットマシンのプロバイダーからオンライン・ハイブリッド・ゲーム・インフラへの移行

 

    クラウドベースの統一データモデルによるサプライチェーンと在庫管理システム

Java开发的分布式流处理平台Apache Kafka的管理

除了初始启动时的配置文件外,管理Apache Kafka时还需要执行各种活动(如创建新主题、更新消费者组的偏移量、触发新选举以确定哪个代理是分区的领导者等)。作为替代方案,有Apache Kafka的Admin API和Java客户端库,以及可调用API进行各种管理任务的命令行脚本集。

如果从Apache的网站上下载Kafka的话,在”bin/”目录下会有一些方便的Shell脚本,用于执行各种管理任务。

观测可能性和Apache Kafka

Apache Kafka因需要调整各种设置来应对流向主题的大量数据和写入磁盘的所有数据,所以在扩展时管理也很困难而出名。如果不深入了解Kafka的内部机制,就不可能知道应该调整哪些参数,操作员将不得不依赖盲目的运气来维持Kafka的平稳运行。Java生态系统提供了用于公开应用程序内部指标的标准接口JMX,而Kafka使用JMX来发布大量关于正在发生的信息。

通常情况下,通过Apache Kafka将指标摄入时序数据库(如M3),使用类似Grafana的可视化工具来观察时间趋势是常见的做法。

Kafka与数据安全

Kafka并不执行数据备份。这是因为Kafka中的数据本质上是瞬时的。所以,当集群离线时,我们如何确认数据不会中断或丢失呢?

答案是使用复制功能,而Apache Kafka具有自己的复制工具MirrorMaker 2。使用MirrorMaker 2的原因有很多,但最重要的是确保数据安全。可以将MirrorMaker类比为特殊的Kafka Connect设置,其中源和目标各连接到不同的Kafka代理。MirrorMaker只是一个从Kafka主题中提取消息的消费者,并将这些消息立即发送到另一个Kafka主题(通常是另一个代理)的生产者而已。由于Kafka消费者可以将偏移状态存储在Kafka中,MirrorMaker提供了在完全独立的两个Kafka代理之间传输消息的方法。通常使用此方法创建“备份”Kafka集群,并在不影响“主要”Kafka集群的情况下,在完全不同的位置创建它。

数据即力量

像Apache Kafka这样的流数据架构可以访问大量的数据。把数据看作是可以随意使用或者麻烦的东西可能很容易。但实际上,数据是你拥有的最有价值的资产,也可能成为最有价值的资产。

通过切割数据,可以更详细地研究服务的使用方式和展示出的性能。监控、扩展、访客行为、安全性、自动化……数据能够实现的事情非常多。

Kafka的安装和管理并不简单。

无论部署规模是小还是大,Apache Kafka都能以惊人的效果运行。它应该始终至少拥有三个代理节点,即使一个代理发生故障,也有多个可用的代理来处理工作负载。然而,这种灵活性是有代价的。需要仔细调整以确保在给定的规模下能够最佳运行。

即使在使用像Aiven这样的托管平台来处理Apache Kafka时,客户端端也有一些决定需要做出:

    • トピックはどのように使用するのか?

 

    • トピックはどのように使用されるか?

 

    • レプリカの数は?

 

    • どの保存期間を使うか?

 

    どのようなコンパクション・ポリシーを使用するのか?

正确执行这些决策非常重要。原因是,除非给客户带来相当大的不便,否则在今后很难进行更改。例如,通过增加或减少分区数来改变从键到分区的分布(从而影响顺序保证),但如果分区数过多超过给定的经纪人尺寸,会影响最大吞吐量。要进行适当的调优设置,重要的是在生产负载下进行故障场景和即时操作更改等测试。

关于管弦乐编曲和自动化

可以实施编排系统来简化配置、管理和调整复杂系统(包括Apache Kafka在内的所有系统)。像Kubernetes这样的编排工具可以配置为自动执行多阶段的过程。这有助于优化需要定期或重复执行的工作流程。只需要在容器中运行即可。

在Terraform中,虽然它们是不同的笔记,但相关性可以定义基础设施代码,使得配置和管理变得轻松。您只需指定配置,Terraform会处理依赖关系和网络方面的繁琐工作。

请参阅关于Kubernetes与Terraform的博客文章以了解关于这两个工具及其功能的详细信息。

使用Aiven开始使用Apache Kafka。

使用与托管Kafka相同提供商的托管DBaaS的好处是什么?一个好处是,构建和管理多服务流水线非常容易。

请使用Aiven for Apache Kafka。

请查看Aiven的开发者文档,并在Kafka世界中迈出第一步。此外,注册免费试用,尽情体验吧。

广告
将在 10 秒后关闭
bannerAds