七的博客

Kafka快速入门1-Kafka简介

消息队列

Kafka快速入门1-Kafka简介

总结概括下 Kafka 这个组件的一些基础知识点以及一些开发过程中的实践,大概分为下面这些内容:

  • Kafka 简单的介绍、历史等。
  • 简单的分析下 kafka 的架构,包括一些核心的术语。
  • 单机版本的 kafka 安装以及使用,主要是通过 java 代码或者 python 代码来演示。
  • Kafka 自带的命令行脚本的介绍,主要是讲开发过程中经常用到的一些脚本。
  • Kafka 生产者的讲解,包括一些配置参数以及性能影响点。
  • Kafka 消费者的讲解,包括一些配置参数以及性能影响点。

通过上面这些内容,对 Kafka 应该有个基本的了解,也算是入门了 Kafka了。

1. 消息队列是什么

消息队列可以理解为是一个缓冲区,可以往消息队列中放入消息,也可以从消息队列中取出消息。

消息队列最早是由 Unix 系统的进程间通信机制引入的,消息队列就是实现进程间通信 (IPC) 的其中一种方式。 很多软件启动后,都是会有多个进程的。每个进程负责特定的业务,然后通过操作系统的消息队列各个进程可以进行通信,协调它们的工作。

微信进程通过操作系统通信

而通常我们说的消息队列一般说的是一个消息队列软件,这个软件需要独立运行。操作系统的消息队列局限于是单台服务器间的进程通信,如果是部署在多台服务器上,进程之间还是无法通过这种方式去通信。同时操作系统的消息队列没有持久化,系统重启后消息就会丢失。

分布式系统间使用消息队列通信

在这种场景下就有了单独的消息队列软件需求,单独的消息队列软件可以用于分布式系统或者应用之间的通信。同时提供消息持久化到磁盘中,这对于企业生产应用是非常重要的特性。

2. Kafka 是什么

官网: https://kafka.apache.org/

简介:

Apache Kafka is an open-source distributed event streaming platform used by thousands of companies for high-performance data pipelines, streaming analytics, data integration, and mission-critical applications.

Apache Kafka 是一个开源的分布式事件流平台,被许多公司用来实现高性能数据管道、流式分析、数据集成和关键任务应用。

官网的介绍 Kafka 是一个分布式事件流平台,而我们一般都会称作 Kafka 是一个消息队列。 因为大部分公司都是把 Kafka 当做消息队列使用,时间久了 Kafka 就成为消息队列的一员。

Kafka 的简单工作流程为:

  • 系统 A 把消息发送到 Kafka 的 Topic 中。
  • Kafka 将这些消息持久化保存起来。
  • 系统 B 从指定 Kafka Topic 中读取消息并做业务逻辑处理。

关于 Kafka 这个名字的由来,作者 Jay Kreps 在 Quora 上有提及过。

I thought that since Kafka was a system optimized for writing using a writer’s name would make sense. I had taken a lot of lit classes in college and liked Franz Kafka. Plus the name sounded cool for an open source project.

So basically there is not much of a relationship.

我认为,既然 Kafka 充分优化了写操作,使用一位作家的名字是有道理的。我在大学时上过很多文学课,而且我很喜欢 Franz Kafka 。此外,Kafka 这个名字听起来很适合作为一个开源项目的名称。

所以,基本上这两者之间没有太大的关系。

3. Kafka 的特点

Kafka 在一众消息队列中这么突出,有自己比较突出的特点:

  • 非常高的吞吐量,在高配的服务器中,Kafka 每秒钟可以处理数百万条数据。
  • Kafka 保证毫秒级的消息传递。
  • Kafka 可以很便捷的进行拓展,从一台服务器扩展到几台服务器,即使部分节点失效也能继续工作。
  • Kafka 支持消息持久化存储。

4. kafka 的版本以及发展历史

Kafka 目前主要分为 3 个版本,分别是:

  • Apache Kafka
  • Confluent Kafka
  • Cloudera/Hortonworks Kafka

至于为什么会搞出这么多个版本,要先看下 Kafka 的起源以及发展历史。

  • 2010 年 Kafka 项目开始于 LinkedIn,当时的需求是构建一个高吞吐量的分布式发布订阅消息系统。
  • 2011 年 Kafka 被开源,贡献给 Apache Software Foundation ,成为 Apache 项目的孵化器项目。
  • 2011 年 Cloudera 开始将 Apache Kafka 集成到其大数据平台 CDH 中。
  • 2012 年 年 Kafka 作为 Apache 顶级项目毕业,开始在更多公司中被采用。
  • 2014 年 由 Kafka 的创始人创建 Confluent 公司,推出商业化版本。

这就是三个版本的发展史,这三个版本也是目前比较流行的版本。

4.1 Apache Kafka

这个是 Apache 社区版本的 Kafka,通常我们说的 Kafka 一般就是指这个版本。 由 Apache 基金会管理,是所有其他发行版的基础。

优势就是开发人数多,迭代速度快,社区响应及时。但是因为是开源组件,所以只提供基础组件。 缺乏高级功能如多系统连接器和监控类的工具,这些需要自行开发或集成第三方工具。

4.2 Confluent Kafka

由 Kafka 创始人创办的 Confluent 公司提供的商业化版本,分为免费版和企业版。 优势就在于企业版提供跨数据中心备份和集群监控等高级功能。

在国内支持不足,相关文档和技术支持有限,普及率较低。这家公司目前应该也没打算发展国内地区的业务。

4.3 Cloudera/Hortonworks Kafka

这个 Kafka 版本是集成在 Cloudera 的 CDH 和 Hortonworks 的 HDP 大数据平台中,简称 CDH Kafka和HDP Kafka。

操作简便,有统一的管理界面,降低运维成本,内置友好的监控界面。但是为了稳定性,版本更新滞后,无法及时获取最新的功能和修复。

5. Kafka 版本号选择

Kafka 使用三位版本号格式:Major.Minor.Patch

  • Major:大版本号,表示重大功能更新。
  • Minor:小版本号,表示新功能增加或改进。
  • Patch:修订版本号,表示错误修复和小的改进。

在下载 Kafka 时,可能会看到像 kafka-2.11-2.1.1 这样的格式。Kafka 是使用 Scala 跟 Java 语言开发的,前面的 2.11 是 Scala 编译器版本,与 Kafka 的版本号无关。

kafka 历史版本的特性如下,资料一部分是从官网的 changelog 里面梳理出来的,有一部分是网上聚合查询出来的:

  • Kafka 0.7 初始版本,提供基本的消息队列功能。
  • Kafka 0.8 引入复制,Kafka Producer 和 Consumer API。
  • Kafka 0.9 安全特性 SSL 和 SASL,新的消费者 API,Kafka Connect。
  • Kafka 0.10 记录时间戳,Kafka Streams,跨数据中心复制。
  • Kafka 0.11 幂等生产者,事务性消息,支持消息头。
  • Kafka 1.0 稳定性和性能优化,支持 Java 9。
  • Kafka 1.1 改进 Streams API,改进 Kafka Connect。
  • Kafka 2.0 支持 TLS 1.3,增强 Kafka Streams。
  • Kafka 2.1 增强副本管理,改进消费者组协调。
  • Kafka 2.2 支持 Zstandard 压缩,增强动态配置更新。
  • Kafka 2.3 镜像制造者 2.0,动态更新客户端日志级别。
  • Kafka 2.4 增强的 Kafka Connect API,支持 SASL/OAUTHBEARER 机制。
  • Kafka 2.5 TopologyTestDriver 支持,增强的错误处理。
  • Kafka 2.6 增强线程安全,改进的消费者组工具。
  • Kafka 2.7 增强 MirrorMaker 2.0,改进的投递保证。
  • Kafka 2.8 支持 Raft 控制器,增强的授权机制。
  • Kafka 3.0 计划移除 ZooKeeper 依赖,增强的 Streams API。
  • Kafka 3.1 增强元数据管理,支持更多客户端协议。

参考链接