【Kafka系列 01】Kafka 是什么?

Kafka 是什么?

用一句话概括一下:Apache Kafka 是一款开源的消息引擎系统

根据维基百科的定义,消息引擎系统是一组规范。企业利用这组规范在不同系统之间传递语义准确的消息,实现松耦合的异步式数据传递。

通俗来讲,就是系统 A 发送消息给消息引擎系统,系统 B 从消息引擎系统中读取 A 发送的消息。

最基础的消息引擎就是做这点事的!不论是上面哪个版本,它们都提到了两个重要的事实:

  • 消息引擎传输的对象是消息;
  • 如何传输消息属于消息引擎设计机制的一部分。

既然消息引擎是用于在不同系统之间传输消息的,那么如何设计待传输消息的格式从来都是一等一的大事。Kafka 使用的是纯二进制的字节序列。当然消息还是结构化的,只是在使用之前都要将其转换成二进制的字节序列。

消息设计出来之后还不够,消息引擎系统还要设定具体的传输协议,即我用什么方法把消息传输出去。常见的有两种方法:

  • 发布 / 订阅模型
  • 点对点模型

在了解了消息引擎系统是做什么的以及怎么做的,但还有个重要的问题是为什么要使用它。

反问一下自己,为什么系统 A 不能直接发送消息给系统 B,中间还要隔一个消息引擎呢?

答案就是 “削峰填谷”。这四个字简直比消息引擎本身还要有名气。

所谓的 “削峰填谷” 就是指缓冲上下游瞬时突发流量,使其更平滑。特别是对于那种发送能力很强的上游系统,如果没有消息引擎的保护,“脆弱”的下游系统可能会直接被压垮导致全链路服务“雪崩”。但是,一旦有了消息引擎,它能够有效地对抗上游的流量冲击,真正做到将上游的“峰”填满到“谷”中,避免了流量的震荡。消息引擎系统的另一大好处在于发送方和接收方的松耦合,这也在一定程度上简化了应用的开发,减少了系统间不必要的交互。

搞定 Kafka 术语

  • 消息:Record。Kafka 是消息引擎嘛,这里的消息就是指 Kafka 处理的主要对象。
  • 主题:Topic。主题是承载消息的逻辑容器,在实际使用中多用来区分具体的业务。
  • 分区:Partition。一个有序不变的消息序列。每个主题下可以有多个分区。
  • 消息位移:Offset。表示分区中每条消息的位置信息,是一个单调递增且不变的值。
  • 副本:Replica。Kafka 中同一条消息能够被拷贝到多个地方以提供数据冗余,这些地方就是所谓的副本。副本还分为领导者副本和追随者副本,各自有不同的角色划分。副本是在分区层级下的,即每个分区可配置多个副本实现高可用。
  • 生产者:Producer。向主题发布新消息的应用程序。
  • 消费者:Consumer。从主题订阅新消息的应用程序。
  • 消费者位移:Consumer Offset。表征消费者消费进度,每个消费者都有自己的消费者位移。
  • 消费者组:Consumer Group。多个消费者实例共同组成的一个组,同时消费多个分区以实现高吞吐。
  • 重平衡:Rebalance。消费者组内某个消费者实例挂掉后,其他消费者实例自动重新分配订阅主题分区的过程。Rebalance 是 Kafka 消费者端实现高可用的重要手段。

用一张图展示上面的这些概念,希望能帮助你形象化的理解所有这些概念:

我应该选择哪个版本的 Kafka?

为什么需要关心版本号的问题呢?直接使用最新版本不就好了吗?当然了,这的确是一种有效的选择版本的策略,但我想强调的是这种策略并非在任何场景下都适用。如果你不了解各个版本之间的差异和功能变化,你怎么能够准确地评判某 Kafka 版本是不是满足你的业务需求呢?因此在深入学习 Kafka 之前,花些时间搞明白版本演进,实际上是非常划算的一件事。

Kafka 版本命名

当前 Apache Kafka 已经迭代到 3.6.1 版本。但是稍微有些令人吃惊的是,很多人对于 Kafka 的版本命名理解存在歧义。比如我们在官网上下载 Kafka 时,会看到这样的版本:

于是有些同学就会纳闷,难道 Kafka 版本号不是 2.12 或 2.13 吗?其实不然,前面的版本号是编译 Kafka 源代码的 Scala 编译器版本。

真正的 Kafka 版本号实际上是 3.6.1。那么这个 3.6.1 又表示什么呢?

在Kafka 1.0.0之前基本遵循4位版本号,比如Kafka 0.8.2.0、Kafka 0.11.0.3等。而从1.0.0开始Kafka就告别了4位版本号,遵循 Major.Minor.Patch 的版本规则,其中:

Major 表示大版本,通常是一些重大改变,因此彼此之间功能可能会不兼容;

Minor 表示小版本,通常是一些新功能的增加;

Patch 表示修订版,主要为修复一些重点Bug而发布的版本。

比如 Kafka 3.6.1,大版本就是3,小版本是 6,Patch 版本为 1,是为修复 Bug 发布的第1个版本。

Kafka 版本演进

Kafka 目前总共演进了 8 个大版本,分别是 0.7、0.8、0.9、0.10、0.11、1.0、2.0 和 3.0,其中的小版本和 Patch 版本很多。哪些版本引入了哪些重大的功能改进?关于这个问题,我建议你最好能做到如数家珍,因为这样不仅令你在和别人交谈 Kafka 时显得很酷,而且如果你要向架构师转型或者已然是架构师,那么这些都是能够帮助你进行技术选型、架构评估的重要依据。

0.7.x 版本

  • 只提供了最基础的消息队列功能,不建议使用。

0.8.x 版本

  • 引入了副本机制,至此 Kafka 成为了一个真正意义上完备的分布式高可靠消息队列解决方案。
  • 引入新版本 Producer API。

0.9.x 版本

  • 安全方面:在0.9.0之前,Kafka安全方面的考虑几乎为0。Kafka 0.9.0 在安全认证、授权管理、数据加密等方面都得到了支持,包括支持Kerberos等。
  • 新版本 Consumer API。
  • 引入了 Kafka Connect 组件。用于实现Kafka与其他外部系统之间的数据抽取。

0.10.x 版本

里程碑式的大版本,因为该版本引入了 Kafka Streams,正式升级成分布式流处理平台。

值得一提的是,自 0.10.2.2 版本起,新版本 Consumer API 已经比较稳定了,而且 Producer API 的性能也得到了提升,因此对于使用 0.10.x 大版本的用户,建议使用或升级到 Kafka 0.10.2.2 版本。

0.11.x 版本

Kafka 0.11 是一个里程碑式的大版本,主要有两个大的变更,一是Kafka从这个版本开始支持 Exactly-Once 语义即精准一次语义,主要是实现了Producer端的消息幂等性,以及事务特性,这对于Kafka流式处理具有非常大的意义。

另一个重大变更是 Kafka 消息格式的重构,Kafka 0.11主要为了实现Producer幂等性与事务特性,重构了投递消息的数据结构。这一点非常值得关注,因为 Kafka 0.11之后的消息格式发生了变化,所以我们要特别注意Kafka不同版本间消息格式不兼容的问题。

1.x 版本

Kafka 1.x 更多的是 Kafka Streams 方面的改进,以及 Kafka Connect 的改进与功能完善等。但仍有两个重要特性:

一是 Kafka 1.0.0 实现了磁盘的故障转移,当 Broker 的某一块磁盘损坏时数据会自动转移到其他正常的磁盘上,Broker 还会正常工作,这在之前版本中则会直接导致 Broker 宕机,因此 Kafka 的可用性与可靠性得到了提升;

二是 Kafka 1.1.0 开始支持副本跨路径迁移,分区副本可以在同一 Broker 不同磁盘目录间进行移动,这对于磁盘的负载均衡非常有意义。

2.x 版本

Kafka 2.x 更多的也是 Kafka Streams、Connect 方面的性能提升与功能完善,以及安全方面的增强等。一个使用特性,Kafka 2.1.0 开始支持 ZStandard 的压缩方式,提升了消息的压缩比,显著减少了磁盘空间与网络 io 消耗。

3.x 版本

在 Kafka 3.0 中包含了许多重要的新功能,其中比较显著有:

  • 已弃用对 Java 8 和 Scala 2.12 的支持,对它们的支持将在 4.0 版本中彻底移除,以让开发者有时间进行调整。
  • Kafka Raft 支持元数据主题的快照,以及 self-managed quorum 方面的其他改进。
  • 废弃了消息格式 v0 和 v1。
  • 默认情况下为 Kafka Producer 启用更强的交付保证。
  • 优化了 OffsetFetch 和 FindCoordinator 请求。
  • 更灵活的 MirrorMaker 2 配置和 MirrorMaker 1 的弃用。
  • 能够在 Kafka Connect 的一次调用中重新启动连接器的任务。
  • 连接器日志上下文和连接器客户端覆盖现在是默认启用的。
  • 增强了 Kafka Streams 中时间戳同步的语义。
  • 修改了 Stream 的 TaskId 的公共 API。
  • 在 Kafka Streams 中,默认的 serde 变成了 null,还有一些其他的配置变化。

Kafka 版本建议

  • 遵循一个基本原则,Kafka 客户端版本和服务端版本应该保持一致,否则你将损失很多 Kafka 为你提供的性能优化收益。
  • 根据是否用到了 Kafka 的一些新特性来选择,假如要用到 Kafka 生产端的消息幂等性,那么建议选择 Kafka 0.11 或之后的版本。
  • 选择一个自己熟悉且稳定的版本,如果说没有比较熟悉的版本,建议选择一个较新且稳定、使用比较广泛的版本。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hyatt1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值