

Kafka 简介
source link: http://www.ibm.com/developerworks/cn/analytics/library/ba-kafka-intro/index.html?ca=drs-&%3Butm_source=tuicool&%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

在 IT 领域,Apache Kafka(下文简称 Kafka)是目前针对分布式消息传递或流数据的最流行平台。使用任意类型的数据(日志、事件等)且需要传输该数据的所有应用程序,以及可能在其组件之间转换数据的所有应用程序,都可以从 Kafka 中获益。Kafka 最初是 LinkedIn 中的一个项目,后来为了方便采用而开放了源码。过去几年里,它一直是一个开源项目,而且成熟了许多。一些 著名的 IT 公司都在自己的生产环境中使用它。
组件介绍
Kafka 中的一些基本组件包括:
- 代理: Kafka 代理是存储发送给 Kafka 的数据的地方。代理负责在数据到达时进行接收和存储。代理还会在收到请求时提供这些数据。许多 Kafka 代理可以共同构建一个 Kafka 集群。Kafka 使用 Apache ZooKeeper 来存储有关集群的元数据。代理使用此元数据来检测故障(比如代理故障)并从中恢复。
- 生产者: 生产者是向代理发送数据的实体。有许多不同类型的生产者。Kafka 提供了自己用 Java 编写的生产者,但其他许多 Kafka 客户端库支持使用 C/C++、Go、Python、REST 等语言。
- 使用者: 使用者是从代理请求数据的实体。类似于生产者,除了内置的 Java 使用者之外,还有其他开源使用者可供对非 Java API 感兴趣的开发人员使用。
Kafka 将数据存储在主题中。生产者将数据发送给特定的 Kafka 主题,使用者从特定的主题读取数据。每个主题都有一个或多个分区。发送给主题的数据最终存储且仅存储在一个分区中。每个分区由一个代理托管,无法扩展到多个代理。
Kafka 能够流行的优势
Kafka 在业界得到持续流行和采用有以下几个原因:
- 可伸缩性: Kafka 的两个重要特性造就了它的可伸缩性。
- Kafka 集群在运行期间可以轻松地扩展或收缩(可以添加或删除代理),而不会宕机。
- 可以扩展一个 Kafka 主题来包含更多的分区。由于一个分区无法扩展到多个代理,所以它的容量受到代理磁盘空间的限制。能够增加分区和代理的数量意味着单个主题可以存储的数据量是没有限制的。
- 容错性和可靠性: Kafka 的设计方式使某个代理的故障能够被集群中的其他代理检测到。由于每个主题都可以在多个代理上复制,所以集群可以在不中断服务的情况下从此类故障中恢复并继续运行。
- 吞吐量: 代理能够以超快的速度有效地存储和检索数据。
Kafka 集群示例
图 1 展示了一个包含 4 个代理的简单 Kafka 集群。此集群中存储了 3 个主题:t1、t2 和 t3。t1 有一个分区且被复制了 3 次,t2 和 t3 各有两个分区且被复制了两次。从此图中可以清楚地看到,这个集群可以在一个代理发生故障的情况下继续工作,而不会丢失任何数据。只有在代理 1 和 4 或代理 3 和 4 是故障对时,该集群才能在发生无损的双代理故障后继续工作。其他任何故障对都会导致部分数据丢失。
图 1. 一个简单的 Kafka 集群

各种各样的生产者和使用者配置都可以使用此集群。例如:
- 客户端 1 可以生成到主题 1(充当生产者)
- 客户端 2 可以生成到主题 2(充当生产者)
- 客户端 3 可以从主题 1 和 2 读取数据,并将数据写到主题 3(同时充当使用者和生产者)
- 客户端 4 可以从主题 3 读取数据
在一些用例中,我们可以实时持续向一些主题传入数据。例如,主题 1 包含来自工厂中不同传感器的温度读数,而主题 2 拥有关于这些传感器的详细信息。然后,上述配置中的客户端 3 会持续接收温度读数,并与最新的传感器规格进行交叉检查,检测异常并在主题 3 中报告它们。在这个场景中,客户端 3 是一个简单的流应用程序,它从一个或多个 Kafka 主题中读取数据,执行一些处理,并将输出写到另一个 Kafka 主题,所有这些都是实时的。
实时分析来自 IoT 设备的数据或网站上的用户操作是 Kafka Streams 可以轻松处理的两个基本示例。本文末尾引用的 Kafka Streams 文档中列出了其他一些用例。
由于上面描述的特性,Kafka 成为了数据传输和 ETL 场景的一种流行选择。事实上,Kafka Streams API 是 Kafka 的一部分,它简化了流应用程序的编写,该程序负责处理传输中的数据。平心而论,Kafka 是一个批处理消息传递平台,现在它已成为一个受欢迎的流处理平台。Kafka Streams 甚至得到了另一个名为 KSQL 的开源项目的增强,该项目极大地简化了使用 SQL 类声明来编写 Kafka Streams 应用程序的过程。
小结
Kafka 和 Kafka Streams 提供的功能远不止这篇短文所介绍的。下面引用的资料更详细地介绍了 Kafka 和 Kafka Streams,还提供了编码示例。对于想要深入了解 Kafka 和 Kafka Streams 的内部原理以及如何在实践中使用它们的人,强烈建议查阅这些资料。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK