Kafka 学习笔记之 Kafka 概述

写在前面

kafka 作为一种基于发布/订阅模式的消息队列在大数据领域尤其是实时领域被广泛使用,其分布式的特点能让其达到每秒百万级的大吞吐量,本篇笔记作为 kafka 系列的开篇准备从消息队列入手然后介绍 kafka 的整体组织架构,文中如有错误欢迎指正,共同进步!

消息队列

何为消息队列

​ 消息队列这个词在各种场景下都会听到,知道其可以将生产者与消费者之间解耦从而实现异步处理,但是这样的表述也许不是很好理解,在这里举个现在生活中的大家都会遇到的例子来帮助理解消息队列的作用。

​ 一天小明在上班时突然接到快递员小哥打来的电话和他说快递送到了,而小明此时正在上面而碰巧小明的小区中没有快递驿站这样的暂存点能够存放快递,此时小明便让快递小哥先去别家,但小哥说你这今天不会再来了你快递快点来签收吧,于是小明一下班就火急火燎的赶回家签收快递,而当中等待下班的时间快递小哥什么都做不了时间就被浪费了。过了几周小明的小区新建了一个快递驿站,这天同样在上班的小明收到了驿站的短信说是有快递到了,于是小明下班后就顺道去取了快递再回家。

​ 在上面的例子中,小明就是消费者而快递小哥则是生产者,在没有快递驿站的情况下快递小哥和小明的耦合性非常强,当小明需要处理别的事情的情况下快递小哥需要一直等待到小明处理完别的事情且签收快递之后才能继续去送别的快递,这无疑是一种浪费,而有了快递驿站之后小明和快递小哥之间就解耦了,小哥无需等待甚至无需通知小明,其只需要将快递放入驿站然后就可以继续去送别的快递后续驿站会通知小明快递到了,而对小明而言其也不用马上取走快递,可以等到自己空闲的时候再到驿站来取走快递,这里的快递驿站就是我们的消息队列

​ 在没有消息队列的情况下一旦我们的消费者被别的事情阻塞而不能马上处理生产者发送的消息时,生产者就会一直进行等待从而浪费资源,而进入了消息队列就可以将二者解耦从而只需要关注自己的职责。可以看下面俩张图来帮助理解(虽然画的很丑):

  • 无快递驿站(消息队列)的情况下

    Kafka 学习笔记之 Kafka 概述

  • 有快递驿站(消息队列)的情况下

    Kafka 学习笔记之 Kafka 概述

消息队列的优点

OK,消息队列的主要作用算是大体讲好了,当然使用消息队列的优势不止于此其主要好处如下:

  1. 解耦

    这即是上面那个例子所描述的事情,使用消息队列能够允许用户独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。

  2. 可恢复性

    系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。

  3. 缓冲

    有助于控制和优化数据流经过系统的速度,解决生产消息和消费消息的处理速度不一致的情况。

  4. 灵活 & 峰值处理

    在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见。如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。

  5. 异步通信

    很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。

消息队列的两种模式

​ 最后再最后补充一点消息队列的两种模式分别是点对点模式与发布/订阅模式 (kafka 为这种模式),这俩种模式的区别就是消息能否被重复消费。

  1. 点对点模式

    消息生产者生产消息发送到 queue中,然后消息消费者从 queue中获取并且消费消息。消息被消费以后, queue 中不再有存储,所以消息消费者不可能消费到已经被消费的消息。Queue 支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。

    Kafka 学习笔记之 Kafka 概述

  2. 发布/订阅模式

    消息生产者(发布)将消息发布到 topic 中,同时有多个消息消费者(订阅)消费该消息。和点对点方式不同,发布到 topic 的消息会被所有订阅者消费 ,kafka 就是基于这种模式,且其只支持消息的持久化保存,在 kafka 中消费端采用拉(pull) 模式其会主动的从订阅的主题中拉去数据并消费。

    Kafka 学习笔记之 Kafka 概述

Kafka 架构

​ 了解了消息队列,那我们的主角 kafka 就要登场了,本篇我们主要讲其组织架构那么话不多说直接上图:

Kafka 学习笔记之 Kafka 概述
​ 上面的图一眼看下去大概的样子就是我们之前所说的消息对面的模型,左边两个生产者,中间一个消息队列,右边三个消费者,但是还有很多东西想必是不太清楚的,接下来就来一一介绍:

  • Broker:一台 kafka 服务器就是一个 broker,一个 kafka cluster 由多个 broker 组成,同一个 broker 内有多个 topic

  • Topic:可理解为一个队列,所有的生产者和消费者行为都是面向 topic 的

  • Partition:一个大的 topic 可以分为多个 partition 从而分布在不同的 broker 上,加大并行度从而加大吞吐量,每个 partition 内部都是有序队列,partition 的存在保证了 kafka 的可扩展性

  • Replication:为了保证数据的不丢失,在某个 broker 挂掉的情况下 kafka 能够继续工作,kafka 提供了备份机制,同一个 partition 会在不同的 broker 上存多份副本并分为 leaderfollower

  • Leader:同一个 partition 会存多份副本,分为 leader 副本和 follower 副本,leader 为 partition 的,生产者和消费者的所有操作都是与 leader 通信

  • Follower:partition 中的,会主动的向 leader 请求同步数据,并在 leader 挂掉后某个 follower 会成为新的 leader

  • Producer:消息的生产者,是向 kafka 中指定的 topic 推送消息的客户端

  • Consumer:消息的消费者,从 kafka 中拉取所订阅的 topic 的消息并进行消费的客户端

  • Consumer Group: 消费者组,在一个消费者能力不够消费同一个 topic 中的消息时可以使用多个消费者组成消费者组来消费不同分区的数据,同一消费者组内的消费者不能消费同一个,不同消费者组的消费者可以消费同一分区的数据,消费者组在逻辑上依然是一个消费者

  • Zookeeper:为 kafka 提供 broker 注册,broker 负载均衡,topic 注册等服务,这里就不展开说了

结语

​ OK,本篇就写到这主要是对消息队列以及 kafka 架构的一个概览,帮助自己总结理解同时也希望能够帮助到你。