1、定义
kafka是一个分布式
的基于发布/订阅模式
的消息队列
的流平台,主要应用于大数据实时处理领域.
这是提取重点关键词:分布式
、发布/订阅模式
、消息队列
1.1、消息队列
为什么需要消息队列
举个简单的例子,你在前几天在网上购买了商品,几天后到时候货到了,但是你现在正在上班,小哥打电话叫你来拿快递,可以你得晚上下班才有时间去拿,这时快递小哥也有许多快递需要送,而且等到晚上小哥也下班了,两个人都在僵持,这时小哥把快递放在你住的地方的楼下的便利店,你下班就可以去拿去了,两人皆大欢喜
!,所以为什么需要消息队列呢
,不用消息队列就必须两个人同时在线
,这是的便利店出现完美解决双方有一方不在线
的尴尬情况,这里的便利店相等于消息队列中间插件
,说了这么多,还是来张图比较简单明了
没有便利店的情况下:
有便利店的情况:
好处:
1) 解耦
在没有便利店时快递小哥哥需要送货,完全需要取决于收货人员
,哪个时间有空,完成依赖收货人员
,出现便利店,快递小哥只需要把快递放置 在便利店即可,不在依赖于收货人
,实现解耦
2)异步
在没有便利店时,快递小哥哥需要等待你到来取快递,在这等待时间无法做其他的事情
,在有便利店后直接把快递放置在便利店,可以干其他的事情,提高效率
3)削峰
比如你购买了许多商品,这是同时到了,如果没有使用便利店(消息队列中间件
)这时你需要去各个快递小哥说的地方去拿快递,有了中间插件后,只需要放在便利店(中间插件中),你就可以慢慢有时间去拿去
1.2、发布/订阅模式
消息队列通信的模式:
有两种模式,点对点模式
、发布订阅模式
1.2.1、点对点模式
一对一
,消费者主动拉取数据,消息收到后消息清除
消息生产者把消息发送到队列中,然后消息消费者从队列中拉取数据并消费消息
,消息被消费后,消息在队列中销毁
,不再在队列中存储,队列Queue可以一对多
,但是消息只有一个消费者消费
,并且消费完消息在队列Queue中删除
点对点模式
的优点:消费者可以拉取消息的频率由自己控制,但是队列中是否有消息需要消费
,消费者不知道
,所以消费者端需要额外的线程去监控
1.2.2、发布订阅模式
一对多:消费者消费数据后不会清除消息
消息生产者发布
信息到 topic
中(消息队列),同时有多个消息消费者订阅
该消息。发布/订阅模式:
有两种模式
第一种
第一种
是生产者将消息放入队列后,队列会将信息推送
给订阅过该类信息的消费者(类似于微信公众号推送文章
)
缺点:
由于消费者被动接收推送
,所以无需感知消息队列是否有待消费消息,但是consumer1、consumer2、consumer3的处理能力不同,但是消息队列无法感知消费者的处理的速度
比如推送的速度是100M/s、consumer1的处理速度是50M/s、consumer2的处理速度是100M/s、consumer3的速度是150M/s,这是consumer1无法承受,consumer3则出现资源浪费.
第二种
第二种:
是生产者将消息放入队列后,订阅该消息的消费者主动拉取消息
缺点:
订阅消息的消费者无法感知消息队列是否有需要消费的信息
,即使消息队列中没有消费信息,也需要拉取去感知是否有需要消费的信息(kafka就是这种模式
)
讲了如此多,主角kafka才登场
,kafka是一种高吞吐量的分布式订阅消息系统
2、Kafka 基础架构
话不多说,先看图
这张图看得很懵逼呀
Producer
:Producer即生产者,消息的产生者,是消息的入口。
kafka cluster
:Broker:Broker是kafka实例,每个服务器上有一个或多个kafka的实例,我们姑且认为每个broker对应一台服务器。每个kafka集群内的broker都有一个不重复的编号,如图中的broker-0、broker-1等……
Topic
:消息的主题,可以理解为消息的分类,kafka的数据就保存在topic。在每个broker上都可以创建多个topic。
Partition
:Topic的分区,每个topic可以有多个分区,分区的作用是做负载,提高kafka的吞吐量。同一个topic在不同的分区的数据是不重复的,partition的表现形式就是一个一个的文件夹!
Replication
:每一个分区都有多个副本,副本的作用是做备胎。当主分区(Leader)故障的时候会选择一个备胎(Follower)上位,成为Leader。在kafka中默认副本的最大数量是10个,且副本的数量不能大于Broker的数量,follower和leader绝对是在不同的机器,同一机器对同一个分区也只可能存放一个副本(包括自己)。
Message
:每一条发送的消息主体。
Consumer
:消费者,即消息的消费方,是消息的出口。
Consumer Group
:我们可以将多个消费组组成一个消费者组,在kafka的设计中同一个分区的数据只能被消费者组中的某一个消费者消费。同一个消费者组的消费者可以消费同一个topic的不同分区的数据,这也是为了提高kafka的吞吐量!
Zookeeper
:kafka集群依赖zookeeper来保存集群的的元信息,来保证系统的可用性。