- 什么是kafka
- 消息队列的应用场景
- kafka架构
- kafka消息存储和生产消费模型
- kafka存储模型
- topic
- kafka消费模型
- kafka特点
- 消费状态谁维护
- kafka读写快的原因
- 零拷贝技术
kafka是一个高吞吐的分布式消息系统,Scala语言写的,存数据的一个工具,有顺序的消息队列,默认只会保留最近7天数据
消息队列的应用场景- 系统之间的解耦合
- 峰值压力缓冲(请求太多了,处理不过来,然后排队解决压力)
- 异步通信(两边不用同时在线也可以实现通信,把发送的请求放到队列中,另一端有空闲来取)
-
producer **消息(数据)**生产者
-
consumer 消息消费者
生产者生产数据,消费者消费数据
-
broker kafka集群的一个节点(一个kafka cluster就是一个broker)
负责处理消息的读、写请求,存储数据(类似于datanode) -
topic 消息队列/分类(类似于一张表的意思,比如学生表,分数表,区分不同的一类数据,一个topic中的数据的结构要一样)
-
元数据存储在zookeeper
-
kafka是去中心化架构
- 一个topic分成多个partition
- 每个partition内部消息强有序,其中的每个消息都有一个序号叫offset(每个partition中的数据都会给打上编号)
- 一个partition只对应一个broker,一个broker可以管多个partition
- 消息不经过内存缓冲,直接写入文件(不用内存,数据量比较大,而且内存不稳定,用了顺序读写和零拷贝技术)
- 根据时间策略删除,而不是消费完就删除(默认七天,之后删除)
- producer自己决定往哪个partition写消息,可以是轮询的负载均衡(第一个数据写第一个分区,第二个写第二个,保证负载均衡),或者是基于hash的partition策略(好处:同样的数据进入同一个分区)
kafka里面的消息是有topic来组织的,简单的我们可以想象为一个队列,一个队列就是一个topic,然后它把每个topic又分为很多个partition,这个是为了做并行的,在每个partition里面是有序的,相当于有序的队列,其中每个消息都有个序号,比如0到12,从前面读往后面写,
一个partition对应一个broker,一个broker可以管多个partition,比如说,topic有6个partition,有两个broker,那每个broker就管3个partition
这个partition可以很简单想象为一个文件(每个分区就是一个文件),当数据发过来的时候它就往这个partition上面append,追加就行,kafka和很多消息系统不一样,很多消息系统是消费完了我就把它删掉,而kafka是根据时间策略删除,而不是消费完就删除,在kafka里面没有一个消费完这么个概念,只有过期这样一个概念
这里producer自己决定往哪个partition里面去写,这里有一些的策略,譬如如果hash就不用多个partition之间去join数据了
kafka消费模型-
consumer**自己维护(自己知道就行)**消费到哪个offset
-
每个consumer都有对应的group(比如一个topic有三个partition,可以写三个线程一起消费,这三个线程可以对应一个组)
-
group内是queue消费模型
各个consumer消费不同的partition
因此一个消息在group内只消费一次 -
group间是publish-subscribe消费模型
各个group各自独立消费,互不影响
因此一个消息在被每个group消费一次
-
消息系统的特点:生存者消费者模型,FIFO(一个分区的时候,实现先进先出)
-
高性能:单节点支持上千个客户端,百MB/s吞吐(受到硬盘读写的限制)
-
持久性:消息直接持久化在普通磁盘上且性能好
-
分布式:数据副本冗余、流量负载均衡、可扩展
-
很灵活:消息长时间持久化+Client维护消费状态
服务端和客户端维护
1、kafka写磁盘是顺序的
2、采用了0拷贝技术
3、批量读写
1、非零拷贝
从WIKI的定义中,我们看到“零拷贝”是指计算机操作的过程中,CPU不需要为数据在内存之间的拷贝消耗资源。而它通常是指计算机在网络上发送文件时,不需要将文件内容拷贝到用户空间(User Space)而直接在内核空间(Kernel Space)中传输到网络的方式。
2、零拷贝
Zero Copy的模式中,避免了数据在用户空间和内存空间之间的拷贝,从而提高了系统的整体性能。Linux中的sendfile()以及Java NIO中的FileChannel.transferTo()方法都实现了零拷贝的功能,而在Netty中也通过在FileRegion中包装了NIO的FileChannel.transferTo()方法实现了零拷贝。
感谢阅读,我是啊帅和和,一位大数据专业大四学生,祝你快乐。



