【kafka学习之一】 kafka初识

环境
  虚拟机:VMware 10
  Linux版本:CentOS-6.5-x86_64
  客户端:Xshell4
  FTP:Xftp4
一、kafka是什么?

(1)kafka是一个高吞吐的分部式消息系统.
(2)消息列队常见应用场景:系统之间解耦合;峰值压力缓冲;异步通信;

二、kafka特点:
1、生产者消费者模型,FIFO。partition内部是FIFO的,partition之间呢不是FIFO的,当然我们可以把topic设为一个partition,这样就是严格的FIFO
2、高性能:单节点支持上千个客户端,百MB/s吞吐
3、持久性:消息直接持久化在普通磁盘上且性能好,直接写到磁盘里面去,就是直接append到磁盘里面去,这样的好处是直接持久话,数据不会丢,第二个好处是顺序写,然后消费数据也是顺序的读,所以持久化的同时还能保证顺序读写
可靠性保证
-自己不丢数据,将消息持久化到磁盘,默认保存1周;
-消费者不丢数据:“至少一次,严格一次”
4、分布式:数据副本冗余、流量负载均衡、可扩展
分布式,数据副本,也就是同一份数据可以到不同的broker上面去,当一份数据,磁盘坏掉的时候,数据不会丢失,比如3个副本,就是在3个机器磁盘都坏掉的情况下数据才会丢。
5、很灵活:消息长时间持久化+Client维护消费状态
消费方式非常灵活,第一原因是消息持久化时间跨度比较长,一天或者一星期等;
第二消费状态自己维护消费到哪个地方了,可以自定义消费偏移量

三、kafka与其他消息队列对比
• RabbitMQ:分布式,支持多种MQ协议,重量级
• ActiveMQ:与RabbitMQ类似
• ZeroMQ:以库的形式提供,使用复杂,无持久化
ZeroMQ是一个socket的通信库,它是以库的形式提供的,所以说你需要写程序来实现消息系统,它只管内存和通信那一块,持久化也得自己写,还是那句话它是用来实现消息队列的一个库,其实在storm里面呢,storm0.9之前,那些spout和bolt,bolt和bolt之间那些底层的通信就是由ZeroMQ来通信的,它并不是一个消息队列,就是一个通信库,在0.9之后呢,因为license的原因,ZeroMQ就由Netty取代了,Netty本身就是一个网络通信库嘛,所以说更合适是在通信库这一层,不应该是MessageQueue这一层
• redis:单机、纯内存性好,持久化较差
Redis,本身是一个内存的KV系统,但是它也有队列的一些数据结构,能够实现一些消息队列的功能,当然它在单机纯内存的情况下,性能会比较好,持久化做的稍差,当持久化的时候性能下降的会比较厉害
• kafka:分布式,较长时间持久化,高性能,轻量灵活
Kafka的亮点,天生是分布式的,不需要你在上层做分布式的工作,另外有较长时间持久化,前面的几个MQ基本消费完就干掉了,另外在长时间持久化下性能还比较高,顺序读和顺序写,另外还通过sendFile这样0拷贝的技术直接从文件拷贝到网络,减少内存的拷贝,还有批量读批量写来提高网络读取文件的性能

四、零拷贝
零拷贝是指计算机操作的过程中,CPU不需要为数据在内存之间的拷贝消耗资源。而它通常是指计算机在网络上发送文件时,不需要将文件内容拷贝到用户空间(User Space)而直接在内核空间(Kernel Space)中传输到网络的方式。

普通拷贝:

零拷贝:

五、kafka的架构

六、kafka的消息存储和生产消费模型

(1)kafka里面的消息由topic来组织的,可以想象为一个队列,一个队列就是一个topic,然后它把每个topic又分为很多个partition,这个是为了做并行的,在每个partition内部消息强有序,相当于有序的队列,其中每个消息都有个序号offset,比如0到12,从前面读往后面写。

(2)一个partition对应一个broker,一个broker可以管多个partition,比如说,topic有6个partition,有两个broker,那每个broker就管3个partition。

(3)这个partition可以很简单想象为一个文件,当数据发过来的时候它就往这个partition上面append,追加就行,消息不经过内存缓冲,直接写入文件,kafka和很多消息系统不一样,很多消息系统是消费完了我就把它删掉,而kafka是根据时间策略删除,而不是消费完就删除,在kafka里面没有一个消费完这么个概念,只有过期这样一个概念。
(4)producer自己决定往哪个partition里面去写,这里有一些的策略,譬如如果hash,不用多个partition之间去join数据了。

(5)consumer自己维护消费到哪个offset

(6)每个consumer都有对应的group,

(7)group内是queue消费模型(各个consumer消费不同的partition,因此一个消息在group内只消费一次)

(8)group间是publish-subscribe消费模型

(9)各个group各自独立消费,互不影响,因此一个消息在被每个group消费一次。



posted @ 2019-04-23 17:01  cac2020  阅读(387)  评论(0编辑  收藏  举报